簡體   English   中英

一個線程控制許多其他線程

[英]One thread controlling many others

我有一個等待客戶端連接的應用程序。 每次客戶端連接時,都會創建一個新的框架(帶有新的套接字文件描述符)。 我知道將連接多少個客戶端,達到該數量后,我僅在for循環中運行pthread_join。

我的問題是我希望主線程控制所有其他線程。 我的目標是讓每個線程一次將相同的消息發送回客戶端。 線程可以發送多個消息。

我當前的想法是定義命令列表,如下所示:

char *commands[] = {
                (char*) "TERMINATE\0",
                .... };

然后指定一個命令號,該命令號表示在該char *數組中使用哪個命令。 所有線程都會做類似的事情

write(sockfd, buffer[commandNumber], length[commandNumber]);

我曾考慮過等待條件變量,但遇到兩個問題:

1)我想確保每個線程盡管同步,但僅執行一次命令。

2)啟動命令的主線程必須知道所有這些線程何時都執行完命令。

我看到的執行2)的唯一方法是跟蹤一個計數器(帶有互斥對象),並且當每個線程執行命令時,它都可以增加該計數器。 我不確定是否可以避免線程兩次運行命令。

最好是協調多個線程以一次執行一個動作的最佳方法; 還可以知道每個線程何時完成該操作?

您可以使用屏障來限制操作。

同步發送

主線程將名為“ Ready”的屏障初始化為N + 1。 然后,它開始accept()建立N個客戶端連接,並為每個客戶端連接生成一個工作線程。 新的工作線程立即等待屏障“就緒”。

在生成第N個(也是最后一個)工作線程之后,主線程將設置所需的命令(也許使用全局commandNumber )。 然后,主線程等待屏障“就緒”。 一旦所有工作線程和主線程到達(達到N + 1的屏障限制),所有線程就被釋放,知道他們准備立即發出命令。

(一種常見的替代方法是使用謂詞和條件變量,而不是使用障礙。例如,主線程可能會生成第N個worker,然后cond_broadcast()設置了標志ready = 1這種方法是有缺陷的。主線程無法知道第N個工人(或者實際上是任何一個工人)仍在這種情況下等待。屏障解決了這個問題。)

表示完成

另一個N + 1障礙“ AllDone”可用於指示工作人員已完成。 初始化為-N並由工作人員發布的信號量將執行相同的操作。 讓工作者close()他們的連接以及主線程select()ing或poll()ing連接也會傳達相同的信息。

暫無
暫無

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

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