2 回答

TA貢獻1835條經驗 獲得超7個贊
您不初始化互斥量或條件變量。它們具有靜態持續時間,因此會參與默認初始化,但是不能保證會產生可用狀態。和的通用方法是使用pthread_cond_init()和pthread_mutex_init(),但是如果默認值足夠,那么您還可以使用初始化器宏:
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t dadam = PTHREAD_COND_INITIALIZER;
pthread_cond_t dudum = PTHREAD_COND_INITIALIZER;
您也嘗試dudum不持有指定的互斥體而等待CV 。調用時,您需要保持互斥量pthread_cond_wait():
pthread_mutex_lock(&mut);
pthread_cond_wait(&dudum, &mut);
(反之亦然)。
但是主要的問題似乎是實現中的競爭條件。
在其循環的每次迭代中,函數都在繼續之前first()等待CV dadam,而在其循環的每次迭代時,函數都在繼續之前second()等待CV dudum。如果可以引導它,這可能會起作用,但是當您第一次啟動這兩個功能時,任何一個都不能繼續等待,以表示另一個正在等待的CV。您dadam從主線程發出信號,但是如果主線程在first()開始等待之前發送信號,則該信號將丟失。
請注意,pthread_cond_signal()
將目標CV的相關互斥鎖鎖定時可以執行一段時間。不需要這樣做,但有些人建議將其作為一種良好做法。
- 2 回答
- 0 關注
- 419 瀏覽
添加回答
舉報