2015-02-23 81 views
1

我正在使用線程池。所以我正在尋找一種簡單而有效的方式來通知父親,孩子已經完成了自己的工作,並且已經準備好開始工作。有沒有辦法做到這一點?C中的通知父子線程

條件變量的使用只是半雙工(從父到孩子),並且完全不建議使用信號。

你的建議是什麼?

在此先感謝。

+0

「*條件變量的使用只是半雙工*」那麼爲什麼不讓我們另一個條件(每個孩子)使其成爲「全雙工」呢? – alk 2015-02-23 14:41:26

+0

孩子可以使用條件變量嗎?我知道他們不能... – TheNobleSix 2015-02-23 14:45:11

+0

我想你可以靜態狀態標誌(例如,每個孩子一個位),哪些訪問受到保護而不受競爭條件的影響。 – lucasg 2015-02-23 14:51:10

回答

1

我認爲你可以通過其他方式解決問題,除非你不想實施像Leader/Follower pattern這樣的線程輪流成爲領導者。這在紙上看起來不錯,但是我發現由於需要大量的鎖定,對於短暫任務來說很少有效。由於上下文切換,使用signalfd或其他形式的等待也不是很好。總結起來,定義有效的爲了提出一個正確的解決方案。

簡單的線程池模式可以逃脫只是貪婪的消費者和沒有孩子到家長的通知。

parent: 
    task = wait_input() 
    lock_queue(q) 
    push_queue(q, task) 
    signal_workers() 
    unlock_queue(q) 

worker: 
    while is_active: 
     lock_queue() 
     task = pop_queue(q) 
     unlock_queue() 
     do_task(task) 

根據您的實現,該signal_workers()可以類似於pthread_cond_signal醒來任何線程,隊列鎖必須被阻止。這樣,客戶端將等待鎖定或處理任務。 如果你想終止他們,你應該設置一個標誌,並廣播它們。 您也可以使用讀/寫鎖定並對條件進行同步。 TL; DR,您應該使用鎖定隊列,而不是按需分配父作業。

再次,您應該根據您的工作量使用鎖定策略。協調長時間運行的作業是一個非常不同的任務,如SLURM,其中父子通知是一個好主意,而線程池則不在此處。

1

通常可以通過pipe來完成。父親會「擁有」閱讀方,孩子會推寫方。
父進程將通過select等待通知。

+0

我想,OP可能會在這裏詢問線程 – zoska 2015-02-23 15:07:05