2

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_onereleaseResource()

Windows 7ブースト 1.52を使用しています。

4

0 に答える 0