pthread_once()
生活随笔
收集整理的這篇文章主要介紹了
pthread_once()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在asterisk 開源Sip系統(tǒng)中,經常會看到這個函數的使用,一直不理解,特意有了下面的總結,但是到現在也沒用理解這個函數在Sip協(xié)議中使用的方法!
在多線程環(huán)境中,有些事僅需要執(zhí)行一次。通常當初始化應用程序時,可以比較容易地將其放在main函數中。但當你寫一個庫時,就不能在main里面初始化了,你可以用靜態(tài)初始化,但使用一次初始化(pthread_once)會比較容易些。
int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));
功能:本函數使用初值為PTHREAD_ONCE_INIT的once_control變量保證init_routine()函數在本進程執(zhí)行序列中僅執(zhí)行一次。
?
在多線程編程環(huán)境下,盡管pthread_once()調用會出現在多個線程中,init_routine()函數僅執(zhí)行一次,究竟在哪個線程中執(zhí)行是不定的,是由內核調度來決定。
Linux Threads使用互斥鎖和條件變量保證由pthread_once()指定的函數執(zhí)行且僅執(zhí)行一次,而once_control表示是否執(zhí)行過。
如果once_control的初值不是PTHREAD_ONCE_INIT(Linux Threads定義為0),pthread_once() 的行為就會不正常。
在LinuxThreads中,實際"一次性函數"的執(zhí)行狀態(tài)有三種:NEVER(0)、IN_PROGRESS(1)、DONE (2),如果once初值設為1,則由于所有pthread_once()都必須等待其中一個激發(fā)"已執(zhí)行一次"信號,因此所有pthread_once ()都會陷入永久的等待中;如果設為2,則表示該函數已執(zhí)行過一次,從而所有pthread_once()都會立即返回0
具體的一個實例:
[csharp] view plaincopy print?執(zhí)行結果:
[csharp] view plaincopy print?總結
以上是生活随笔為你收集整理的pthread_once()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.2.1.3 Range Optimi
- 下一篇: 【Codeforces717F】Hero