0

我有一个等待客户端连接的应用程序。每次客户端连接时,都会创建一个新帧(使用新的套接字文件描述符)。我知道有多少客户端将连接,在我达到这个数字后,我只需在 for 循环中运行 pthread_join。

我的问题是我希望主线程控制所有其他线程。我的目标是让每个线程同时向客户端发送相同的消息,并且只发送一次。一个线程可以发送多条消息。

我目前的想法是定义一个命令列表,如下:

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

然后指定一个命令编号,该编号表示要在该 char* 数组中使用的命令。所有线程都会做类似的事情

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

我考虑过等待条件变量,但我发现了两个问题:

1)我想确保每个线程虽然同步,但只执行一次命令。

2)启动命令的主线程必须知道所有这些线程何时完成执行命令。

我看到执行 2) 的唯一方法是跟踪计数器(使用互斥锁),当每个线程执行命令时,它可以增加该计数器。我不确定我能否避免线程两次运行该命令。

请协调多个线程一次执行单个操作的最佳方法是什么?并且还能够知道该动作何时完成每个线程的执行吗?

4

1 回答 1

1

您可以使用屏障来关闭操作。

同步发送

主线程将一个名为“Ready”的屏障初始化为 N+1。然后它开始 accept()ing N 个客户端连接,为每个连接生成一个工作线程。新的工作线程立即等待屏障“就绪”。

在产生第 N 个(也是最后一个)worker 之后,主线程设置所需的命令(可能使用 global commandNumber)。然后主线程等待屏障“就绪”。一旦所有工作线程和主线程到达(达到屏障的 N+1 限制),所有线程都被释放,知道它们已准备好立即发出命令。

(一种常见的替代方法是使用谓词和条件变量而不是障碍。例如,主线程可能会产生第 N 个工作程序,然后 cond_broadcast() 它设置了一个标志ready = 1这种方法是有缺陷的。 主线程不能知道第 N 个工人——或者,事实上,任何一个工人——还在等待那个条件。屏障解决了这个问题。)

表示完成

另一个 N+1 障碍,“AllDone”,可以用来表示工人都完成了。初始化为 -N 并由工作人员发布的信号量也会这样做。让工作人员关闭()他们的连接和主线程选择()或轮询()连接也将传达相同的信息。

于 2013-05-02T01:34:53.450 回答