簡體   English   中英

在C中通知父線程的子級

[英]Notification Child to Father Thread in C

我正在使用線程池。 因此,我正在尋找一種簡單有效的方法來通知父親孩子已經完成工作,並准備在另一個孩子上工作。 有沒有辦法做到這一點?

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

你有什么建議?

提前致謝。

您通常可以通過pipe 父親將“擁有”讀取側,孩子將推動寫入側。
父進程將通過select等待通知。

我認為您正在以其他方式解決問題,除非您不想實現類似Leader / Follower模式的事情,在這種情況下線程輪流擔任領導者。 在紙上看起來不錯,但是由於所需的鎖定數量,我發現它對於臨時任務幾乎沒有效率。 由於上下文切換,使用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之類的東西上協調長時間運行的工作是非常不同的任務,在SLURM中 ,以孩子為父母的通知是一個好主意,而在線程池中則不是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM