Ral*_*zky 5 c++ multithreading blocking threadpool c++11
我正在用C++编写一个线程池类,它接收要并行执行的任务.如果可能的话,我希望所有核心都忙,但有时一些线程处于空闲状态,因为它们被阻塞了一段时间以进行同步.当发生这种情况时,我想启动一个新线程,以便总有大约与cpu核心一样多的线程清醒.为此,我需要一种方法来确定某个线程是醒着还是睡眠(被阻塞).我怎么能找到这个?
我更喜欢使用C++ 11标准库或提升以实现可移植性.但如果有必要,我也会使用WinAPI.我在Windows 7上使用Visual Studio 2012.但实际上,我希望有一种可移植的方式来实现这一点.
优选地,该线程池应该能够掌握类似的情况
MyThreadPool pool;
for ( int i = 0; i < 100; ++i )
pool.addTask( &block_until_this_function_has_been_called_a_hundred_times );
pool.join(); // waits until all tasks have been dispatched.
Run Code Online (Sandbox Code Playgroud)
函数block_until_this_function_has_been_called_a_hundred_times()
阻塞,直到100个线程调用它.此时所有线程都应该继续运行.线程池的一个要求是它不应该死锁,因为池中的线程数太少.
使用Boost Asio。它有自己的线程池管理和调度框架。基本思想是io_service
使用该post()
方法将任务推送到对象,并run()
从与您拥有的 CPU 核心数量相同的线程中进行调用。您应该work
在计算运行时创建一个对象,以避免线程在没有足够的作业时退出。
Asio 的重要一点是永远不要使用任何阻塞调用。对于I/O调用,使用Asio自带的I/O对象的异步调用。对于同步,请使用strand
对象而不是互斥体。如果您将函数发布到包装在链中的 io 服务,那么它可以确保在任何时候最多运行一个属于特定链的任务。如果存在冲突,任务将保留在 Asio 的事件队列中,而不是阻塞工作线程。
但使用异步编程有一个缺点。阅读分散在多个异步调用中的代码比阅读具有清晰控制流的代码要困难得多。在设计程序时您应该意识到这一点。
归档时间: |
|
查看次数: |
1685 次 |
最近记录: |