boost::threads を使用して共有リソースを管理するためのセマフォの実装があります。セマフォの私の実装は以下のとおりです。
void releaseResource()
{
boost::unique_lock<boost::mutex> lock(mutex_);
boost::thread::id curr_thread = boost::this_thread::get_id();
// scan through to identify the current thread
for (unsigned int i=0; i<org_count;++i)
{
if (res_data[i].thread_id == curr_thread)
{
res_data[i].thread_id = boost::thread::id();
res_data[i].available = true;
break;
}
}
++count_;
condition_.notify_one();
}
unsigned int acquireResource()
{
boost::unique_lock<boost::mutex> lock(mutex_);
while(count_ == 0) { // put thread to sleep until resource becomes available
condition_.wait(lock);
}
--count_;
// Scan through the resource list and hand a index for the resource
unsigned int res_ctr;
for (unsigned int i=0; i<org_count;++i)
{
if (res_data[i].available)
{
res_data[i].thread_id = boost::this_thread::get_id();
res_data[i].available = false;
res_ctr = i;
break;
}
}
return res_ctr;
}
私の質問は、使用可能なリソースの数よりも多くのスレッドがある場合に気付くパフォーマンスの低下に関するものです。コードに示されているのではnotify_all
なく、スレッドを起こす方法を使用すると、パフォーマンスが向上することがわかります。他の誰かが同様のことを経験しましたか?notify_one
releaseResource()
Windows 7とブースト 1.52を使用しています。