專案中遇到乙個bug,因為接入了幾家越獄平台:91、同步推、pp助手,在裝置上安裝了三個應用,啟用其中任意乙個,另外二個啟動後無法建立傳送socket訊息,從而導致遊戲直接死在登入那裡,再次點選登入時執行緒才會被喚醒(無法傳送的原因定位到,是因為在呼叫sem_post方法後無法將執行緒喚醒)。之後我嘗試將訊號量改為條件變數,就再也沒有遇到那個問題了。具體改寫的幾個方法:
sem_open/sem_init => pthread_cond_init
sem_close/sem_destroy => pthread_cond_destroy
sem_wait => pthread_cond_wait
sem_post => pthread_cond_signal
訊號量不僅可以用於程序也可用於執行緒,它比條件變數要複雜很多,條件變數僅限於執行緒內使用。
翻看cocos2d-x的原始碼中,紋理快取用到了訊號量:
// lazy init
if (s_psem == null)
#else
int seminitret = sem_init(&s_sem, 0, 0);
if( seminitret < 0 )
s_psem = &s_sem;
#endif
光訊號量的初始化就得根據不同平台來寫**,而用條件變數進行替代則只需要一行**,不需要針對不同的平台寫不同的**,**量小了。
避免使用訊號量,除了維護的**較多以外,還有乙個重要的原因是它容易用錯。陳碩在他的著作《linux多執行緒服務端程式設計》p85頁中明確指出了,避免使用訊號量(semaphore),它的功能與條件變數重合,但容易出錯。在《併發程式設計的 15 條建議(譯)》也提及如果mutex就能解決問題,就不要使用訊號量semaphore。
多執行緒 訊號量
訊號量 semaphore類 建立帶指定許可數的訊號量 semaphore semaphore new semaphore 1 建立乙個許可的訊號量 訊號量用來限制訪問共享數資源的執行緒數。在訪問資源之前,執行緒必須從訊號量獲取許可,在訪問完資源後釋放訊號量。任務通過呼叫訊號量的acquire 方法...
多執行緒通訊 訊號量
當當前資源的數量大於0的時候,等待訊號量的執行緒可以獲得乙個資源並繼續執行,訊號量的當前資源數量將減1,如果當前資源的數量為0,則等待訊號量的執行緒將處於等待狀態,直到有執行緒釋放訊號量,使訊號量標識的資源數量大於0 handle createsemaphore lpsecurity attribu...
多執行緒之訊號量
本文的訊號量型別為posix無名訊號量 1 訊號量基礎知識 2 訊號量的主要用到的函式 int sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem int...