我有10個線程應該等待信號。 到目前爲止,我只是做了'睡眠(3)',這一直工作正常,但是有一種更安全的方式來確保所有線程都已創建並且確實在等待。確保創建線程並在廣播前等待
我做了以下建設,我在臨界區域,在等待之前,增加一個計數器,告訴有多少線程在等待。但是接下來我必須有一個額外的互斥鎖,並且有條件地向所有線程創建的主要信號發送,看起來過於複雜。
我是否缺少一些基本的線程設計模式?
感謝 編輯:固定類型
編輯:澄清如下
信息的壁壘不會在這種情況下工作,因爲我不感興趣,讓我的線程等待,直到所有線程都準備好了。這已經發生在'cond_wait'。
我感興趣的是在所有線程都準備好並等待時讓主函數知道。
//mutex and conditional to signal from main to threads to do work
mutex_t mutex_for_cond;
condt_t cond;
//mutex and conditional to signal back from thread to main that threads are ready
mutex_t mutex_for_back_cond;
condt_t back_cond;
int nThreads=0;//threadsafe by using mutex_for_cond
void *thread(){
mutex_lock(mutex_for_cond);
nThreads++;
if(nThreads==10){
mutex_lock(mutex_for_back_cond)
cond_signal(back_cond);
mutex_unlock(mutex_for_back_cond)
}while(1){
cond_wait(cond,mutext_for_cond);
if(spurious)
continue;
else
break;
}
mutex_unlock(mutex_for_cond);
//do work on non critical region data
}
int main(){
for(int i=0;i<10)
create_threads;
while(1){
mutex_lock(mutex_for_back_cond);
cond_wait(back_cond,mutex_for_back_cond);
mutex_unlock(mutex_for_back_cond);
mutex_lock(mutex_for_cond);
if(nThreads==10){
break;
}else{
//spurious wakeup
mutex_unlock(mutex_for_cond);
}
}
//now all threads are waiting
//mutex_for_cond is still locked so broadcast
cond_broadcast(cond);//was type here
}
您在這裏出現的版本已經是越野車了。 (1)你正在閱讀`nThreads`而沒有鎖定。 (2)如果出現「虛假喚醒」,您將解鎖互斥鎖兩次。 – 2011-12-13 23:12:02
而你的客戶端也鎖定兩次。也許你試圖在你嘗試引入進一步的複雜性之前嘗試獲取現有的代碼。 – 2011-12-13 23:13:35