2012-03-31 17 views
1

我的目标是使用线程池与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来解决这个问题。

编辑:我应该指出,如果不清楚,每个任务都需要在完成之前先完成,然后才能进入下一个任务。

+0

因此,所有线程都在不同的项目上执行相同的任务,直到数据完成,然后同步并传递给下一个任务? – Tudor 2012-03-31 12:17:39

+0

这是正确的。项目之间或任务之间没有数据交换,所有事情都可以视为独立。 – Dan 2012-03-31 12:31:27

回答

1

我对你的描述有点困惑,希望以下是相关的。

我总是看着这个模式,发现它非常有用:“老板”负责检测工作并根据某种算法将其分配给工作池,从那时起,工作人员是独立的。

在这种情况下,工作人员始终在等待工作,不知道任何其他实例,处理请求以及何时完成,可能会触发完成通知。 这具有工作本身和线程间平衡算法之间良好分离的优点。

另一种选择是让“老板”维护一个工作项目池,工作人员一有空就可以随时拿起。但我想这实现起来比较复杂,需要更多的同步。我没有看到第二种方法比前一种方法的好处。

控制逻辑和工人状态在两种情况下均由“老板”维护。 由于并行工作是在一项任务上完成的,“boss”“object”正在处理一项任务,在一个简单的实现中,这个“boss”阻塞,直到任务完成,允许按队列调用下一个“boss”。

关于同步,除非我在这里丢失了某些东西,您只需要为所有工作人员同步一次即可完成此同步,并在工作人员只发送完成通知的“老板”完成同步。