我的目标是使用线程池与pthreads,并试图在这两种线程模型之间进行选择,在我看来,对等模型更适合使用固定输入,而老板/员工模型更适合动态更改工作项目。但是,我有点不确定如何让对等模型与线程池一起工作。线程池 - 老板/工人VS对等(workcrew)模型
我有一些任务需要在同一个数据集上执行。下面是我会怎么看待解决这一一些简单的伪代码:
data = [0 ... 999]
data_index = 0
data_size = 1000
tasks = [0 ... 99]
task_index = 0
threads = [0 ... 31]
thread_function()
{
while (true)
{
index = data_index++ (using atomics)
if index > data_size
{
sync
if thread_index == 0
{
data_index = 0
task_index++
sync
}
else
{
sync
}
continue
}
tasks[task_index](data[index])
}
}
(首先,它好像应该把这项工作只使用一个同步点的一种方式,但我不知道这是否是可能的? )
上面的代码看起来好像对于预先知道任务的情况很好,但我猜测对于这个特定的问题,一个线程池是不必要的。但是,即使所有任务中的数据项仍是预定义的,但如果事先未知,那么似乎老板/员工模型更适合?是否有可能使用老板/员工模式,但是仍然允许线程自己提取任务(如上所述),在这种情况下,在所有任务完成之前,老板基本上都会暂停工作? (也许这仍然称为对等模型?)
最后一个问题是关于同步,障碍或条件变量,为什么?
如果任何人可以提出任何建议,以更好地解决这个问题,甚至在我的任何假设中钻出洞,那会很好吗?不幸的是我受限于使用更高级别的库,如tbb来解决这个问题。
编辑:我应该指出,如果不清楚,每个任务都需要在完成之前先完成,然后才能进入下一个任务。
因此,所有线程都在不同的项目上执行相同的任务,直到数据完成,然后同步并传递给下一个任务? – Tudor 2012-03-31 12:17:39
这是正确的。项目之间或任务之间没有数据交换,所有事情都可以视为独立。 – Dan 2012-03-31 12:31:27