如何重用线程 - pthreads c

时间:2012-04-20 04:39:27

标签: c synchronization pthreads

我在C中使用pthreads进行编程。

我有一个父线程需要创建id为0,1,2,3的4个子线程。 当父线程获取数据时,它将设置拆分数据并将其分配给4个单独的上下文变量 - 每个子线程一个。 子线程必须处理这些数据,同时父线程应该在这些线程上等待。 一旦这些子线程完成执行,它们将在相应的上下文变量中设置输出并等待(重用)。 一旦父线程知道所有这些子线程都完成了这一轮,它就会计算全局输出并将其打印出来。 现在它等待新数据(子线程还没有被杀死,它们只是在等待)。

如果父线程获得更多数据,则重复上述过程 - 尽管已经创建了4个线程。

如果父线程收到kill命令(假设一种特定类型的数据),它会向所有子线程指示它们自己终止。现在父线程可以终止。

我是硕士研究生,我遇到了上述情况的需要。我知道这可以使用pthread_cond_wait,pthread_Cond_signal来完成。我已经编写了代码,但它只是无限期地运行,我无法弄清楚原因。

我的猜测是,我编码它的方式,我已经过度复杂的情况。知道如何实现这将是非常有帮助的。如果有需要,我可以发布我的代码的简化版本来显示我想要做的事情(即使我认为我的方法存在缺陷!)...

您能否告诉我有关如何使用pthread实现此方案的任何见解?

2 个答案:

答案 0 :(得分:1)

从您的描述中可以看出,该原则似乎没有任何问题。

你想要实现的是一个工作池,我想,应该有很多实现。如果你的线程正在做的工作是一个实质性的计算(比如至少一个CPU左右),这样的方案是一个完全的过度杀伤。 POSIX线程的现代实现足够高效,它们支持创建大量线程,实际上很多,而且开销并不高。

如果让工作人员通过共享变量,互斥体等进行通信(而不是通过线程的返回值),唯一重要的是通过使用属性参数{{1}来启动线程分离}}

完成任务后,请进行衡量。只有这样,如果您的探查器告诉您在pthread例程中花费了大量时间,那么就开始考虑实现(或使用)工作池来回收线程。

答案 1 :(得分:0)

一个有4个线程的生产者 - 消费者线程。想要对四个任务进行排队的线程组装了四个上下文结构,其中包含所有其他数据内容,一个指向'OnComplete'func的函数指针。然后它将所有四个上下文提交到队列,原子地将taskCount递增到4,并等待事件/ condvar / semaphore。

四个线程从P-C队列中获取上下文并消失。

完成后,线程调用'OnComplete'函数指针。

在OnComplete中,线程以原子方式倒计数taskCount。如果一个线程将它减少到零,则表示事件/ condvar / semaphore和原始线程运行,并知道所有任务都已完成。

安排它并不困难,以便上下文的组装和同步等待也在任务中完成,因此允许池一次为多个请求线程处理多个'ForkAndWait'操作。

我必须补充说,像这样的操作在OO语言中更容易。例如,最新的Java有一个'ForkAndWait'线程池类,应该可以完成这类工作,但是C ++(或者甚至C#,如果你进入农奴制),要比普通的C好。