我开始使用多线程的boost来将程序移植到窗口(来自linux的pthread)。有没有人熟悉它?我应该使用哪种模式的建议?
以下是要求:
对于pthread,每个东西都是函数,所以我不确定我是否应该将它转换为object,那么有什么优势呢?阅读本教程后http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html使用了很多选项......
,这有点混乱提前致谢
答案 0 :(得分:3)
移植应该非常简单:
我大部分时间都有很多主题 用不同的方式运行同样的东西 参数,
使用functor绑定不同的参数创建所需数量的线程,例如:
boost::thread thr1(boost::bind(your_thread_func, arg1, arg2));
所有线程共享一个内存位置 称为“关键记忆”(数组)
这里没什么特别的,只需使用boost :: mutex来同步访问(如果有特殊要求,可以使用其他互斥类型)
必须使用a进行同步 某些迭代中的“障碍”
使用boost::barrier
:http://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可能太麻烦了。