私は conditional_variables の使用に慣れていないので、ここで簡単に愚かなことをすることができますが、関数を直接呼び出すのではなく、ブースト スレッドを使用すると、奇妙なパフォーマンスが得られます。func でブースト スレッドを作成する行を、単に func を直接呼び出すように変更すると、コードは数桁速く実行されます。ソースフォージからブーストスレッドプールソフトウェアを使用してみましたが、違いはありません...
コードは次のとおりです。
#include <boost/thread.hpp>
using namespace boost;
condition_variable cond;
mutex conditionalMutex;
int numThreadsCompleted = 0;
int numActiveThreads = 0;
void func()
{
{
lock_guard<mutex> lock(conditionalMutex);
--numActiveThreads;
numThreadsCompleted++;
}
cond.notify_one();
};
int main()
{
int i=0;
while (i < 100000)
{
if (numActiveThreads == 0)
{
++numActiveThreads;
thread thd(func);
//Replace above with a direct call to func for several orders of magnitude
//performance increase...
++i;
}
else
{
unique_lock<mutex> lock(conditionalMutex);
while (numThreadsCompleted == 0)
{
cond.wait(lock);
}
numThreadsCompleted--;
}
}
return 0;
}