一个线程控制许多其他人

时间:2013-05-02 01:08:09

标签: c multithreading pthreads

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

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

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

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

然后指定一个命令编号,表示在该char *数组中使用哪个命令。所有线程都会执行类似

的操作
write(sockfd, buffer[commandNumber], length[commandNumber]);

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

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

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

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

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

1 个答案:

答案 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()连接也会传达相同的信息。