我应该使用哪种提升多线程设计模式?

时间:2010-12-31 10:29:55

标签: multithreading design-patterns boost

我开始使用多线程的boost来将程序移植到窗口(来自linux的pthread)。有没有人熟悉它?我应该使用哪种模式的建议?

以下是要求:

  • 我有很多线程,大多数时候用不同的参数运行相同的东西,
  • 所有线程共享一个名为“critical memory”(数组)的内存位置
  • 必须在某次迭代时使用“屏障”进行同步
  • 如果可能的话,
  • 需要最高的并行化,即对所有线程都有相同优先级的良好调度(目前我让CPU完成这项工作,但我发现boost有线程池与thread.schedule()不确定我是否应该使用)

对于pthread,每个东西都是函数,所以我不确定我是否应该将它转换为object,那么有什么优势呢?阅读本教程后http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html使用了很多选项......

,这有点混乱

提前致谢

2 个答案:

答案 0 :(得分:3)

移植应该非常简单:

  •   

    我大部分时间都有很多主题   用不同的方式运行同样的东西   参数,

使用functor绑定不同的参数创建所需数量的线程,例如:

boost::thread thr1(boost::bind(your_thread_func, arg1, arg2));
  •   

    所有线程共享一个内存位置   称为“关键记忆”(数组)

这里没什么特别的,只需使用boost :: mutex来同步访问(如果有特殊要求,可以使用其他互斥类型)

  •   

    必须使用a进行同步   某些迭代中的“障碍”

使用boost::barrierhttp://www.boost.org/doc/libs/1_45_0/doc/html/thread/synchronization.html#thread.synchronization.barriers

  • requires highest parallelization if possible i.e good scheduling with same priority for all threads ( currently I let CPU does the job, but I find out that boost has threadpool with thread.schedule() not sure if i should use )

CPU?可能你的意思是OS调度程序。这是最简单的解决方案,在大多数情况下是令人满意的解决方案。 threadpool不是boost的一部分而且我不熟悉它。 boost thread没有调度程序。

我对你的任务及其并行化潜力一无所知,所以我认为它可以并行化到比你拥有核心更多的线程。从理论上讲,要获得最高性能,您需要在线程数=核心数(包括虚拟核心数)之间顺利分配您的工作。这不是最简单的任务,您可以使用现成的解决方案。例如Intel Threading Building Blocks(GPL许可)或甚至Boost Asio。尽管其主要目的是网络通信,但Asio有其调度程序,您可以将其用作线程池。只需创建最佳线程数(核心数?),boost :: asio :: io_service对象并从所有线程运行它。通过io_service::post()

将工作发布到线程池

答案 1 :(得分:0)

在我看来,使用pthread的win32端口是完成此类任务的更直接的方法。

<强> EDITED

上个月,我将1年前的项目源代码从Boost.Thread转换为pthread-w32。 Boost.Thread提供了许多好东西,但是如果你正在研究旧的时尚线程例程Boost.Thread可能太麻烦了。