我有一个等待客户端连接的应用程序。每次客户端连接时,都会创建一个新帧(使用新的套接字文件描述符)。我知道有多少客户端将连接,在我达到该数字后,我只是在for循环中运行pthread_join。
我的问题是我希望主线程能够控制所有其他线程。我的目标是让每个线程同时向客户端发送相同的消息,并且只发送一次。线程可以发送多条消息。
我目前的想法是定义一个命令列表,如下所示:
char *commands[] = {
(char*) "TERMINATE\0",
.... };
然后指定一个命令编号,表示在该char *数组中使用哪个命令。所有线程都会执行类似
的操作write(sockfd, buffer[commandNumber], length[commandNumber]);
我考虑过等待条件变量,但我发现有两个问题:
1)我想确保每个线程虽然是同步的,但只执行一次命令。
2)启动命令的主线程必须知道所有这些线程何时完成执行命令。
我只看到执行2)是跟踪计数器(使用互斥锁),当每个线程执行命令时,它可以增加该计数器。我不确定我是否能够避免线程两次运行命令。
请协调多个线程同时执行单个操作的最佳方法是什么?并且还能够知道该动作何时完成每个线程的执行?
答案 0 :(得分:1)
您可以使用barrier来操作操作。
主线程将名为“Ready”的屏障初始化为N + 1。然后它开始接受()N个客户端连接,为每个连接生成一个工作线程。新工作线程立即等待屏障“就绪”。
在产生第N个(和最后一个)工作符之后,主线程设置所需的命令(可能使用全局commandNumber
)。然后主线程在屏障“Ready”上等待。一旦所有工作人员和主线程都到达(达到N + 1的屏障限制),所有线程都会被释放,因为他们已经准备立即发出命令。
(一种常见的替代方法是使用谓词和条件变量而不是屏障。例如,主线程可能会产生第N个工作符,然后cond_broadcast()它已设置标志ready = 1
。 strong>这种方法存在缺陷。主线程无法知道第N个工人 - 或者实际上是任何工人 - 还在等待这个条件。障碍解决了这个问题。)
另一个N + 1障碍,“AllDone”,可以用来表明工人都已完成。初始化为-N并由工作人员发布的信号量也会这样做。让工作人员关闭()他们的连接和主线程select()ing或poll()连接也会传达相同的信息。