2013-09-25 74 views
0

如果沒有其他線程使用變量標誌,確保主線程永遠不會錯過喚醒信號,這是否安全?確保不會丟失cond信號的安全方法

void *Cancel_master_thread(void *arg) 
{ 
    while (1) 
    { 
    flag = 0; 
    pthread_mutex_lock(&cancel_in_progress); 
    flag = 1; 
    pthread_cond_wait(&cancel_finished, &cancel_in_progress); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 

void *Cancel_slave_MB() 
{ 
    while (1) 
    { 
    while (flag != 1) 
    { 
    } 

    pthread_mutex_lock(&cancel_in_progress); 
    pthread_cond_signal(&cancel_finished); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 

回答

0

更改主標誌後,必須產生處理器,以便主控可以執行。 (通常,關於線程和多處理器在這裏有很長的討論。)所以你想要有某種阻塞調用(比如睡眠),這樣主服務器就可以運行。目前,您已將Cancel_slave_MB運行在一個緊密的循環中,所以沒有別的機會可以運行。

編輯所以你的例子是有點骨子裏。如果您設置了斷點或printf(在鎖定區域之外),它們是否正確執行?我會說永遠不會循環,這就是信號量的要點。

+0

但我要的是什麼時候睡覺主來自奴隸的信號到達。所以當標誌值爲1時,主機會休眠,只有從機才能鎖定互斥併發送信號。不是嗎?對於多處理器系統,線程是同時執行的。那麼問題在哪裏?我忘了提到,解鎖互斥體cancel_in_progress後奴隸睡覺,我只是沒有在發佈的代碼中結束pthread_cond_wait命令。 – iiirxs

+0

是的,他們執行很長一段時間,但不知何故主線程不喚醒,所以一切都停止... – iiirxs

0

如果你的縮進是cancel_master_thread()執行只有一個pthread_cond_wait()一個pthread_cond_signal()cancel_slave_MB()(而在while -loop),然後做下面的方法:

void * cancel_master_thread(void *arg) 
{ 
    pthread_mutex_lock(&cancel_in_progress); 

    while (1) 
    { 
    pthread_cond_wait(&cancel_finished, &cancel_in_progress); 

    /* do something per signal received */ 
    } 

    pthread_mutex_unlock(&cancel_in_progress); 
} 

void * cancel_slave_MB() 
{ 
    while (1) 
    { 
    /* do something */ 

    pthread_mutex_lock(&cancel_in_progress); 
    pthread_cond_signal(&cancel_finished); 
    pthread_mutex_unlock(&cancel_in_progress); 
    } 
} 
+0

這段代碼的重點是什麼?我的意思是,所有的主線程都會在睡眠後進入睡眠狀態... – iiirxs

+0

@iiirxs:是的,但是主人保證每個信號都會醒來,不會錯過任何信號。這可能是我不明白你發佈的代碼的意圖是什麼。 – alk