我正在用 C++ 编写一个线程池类,它接收要并行执行的任务。如果可能的话,我希望所有内核都处于忙碌状态,但有时某些线程是空闲的,因为它们出于同步目的而被阻塞了一段时间。发生这种情况时,我想启动一个新线程,以便始终有大约与 cpu 内核一样多的线程处于唤醒状态。为此,我需要一种方法来确定某个线程是唤醒还是休眠(阻塞)。我怎样才能找到这个?
出于可移植性目的,我更喜欢使用 C++11 标准库或 boost。但如有必要,我也会使用 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.
函数block_until_this_function_has_been_called_a_hundred_times()
阻塞直到 100 个线程调用它。此时所有线程都应该继续运行。线程池的一个要求是它不应该因为池中的线程数量太少而死锁。