24

別のスレッドがタスクキューの処理を完了するまで、条件変数を使用してスレッドを停止しています (長い話)。したがって、1 つのスレッドでロックして待機します。

boost::mutex::scoped_lock lock(m_mutex);
m_condition.wait(lock);

他のスレッドがそのタスクを完了すると、待機中のスレッドに次のように通知します。

boost::mutex::scoped_lock lock(m_parent.m_mutex);
m_parent.m_condition.notify_one();

私が見ている問題は、次の命令にブレークポイントを設定しない限り、待機中のスレッドが待機を停止しないことです (私は xcode、fyi を使用しています)。はい、これは奇妙に思えます。なぜこれが起こっているのか誰にも分かりますか?条件変数を誤用していませんか?

4

2 に答える 2

2

ディスカッションに基づいて、ブースト条件の使用方法を示す例を実装しました。

#include <iostream>

#include <boost/asio.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

boost::mutex io_mutex;
bool worker_is_done = false;
boost::condition_variable condition;

void workFunction()
{
    std::cout << "Waiting a little..." << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    worker_is_done = true;
    std::cout << "Notifying condition..." << std::endl;
    condition.notify_one();
    std::cout << "Waiting a little more..." << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(1));
}

int main()
{
    boost::mutex::scoped_lock lock(io_mutex);
    boost::thread workThread(&workFunction);

    while (!worker_is_done) condition.wait(lock);
    std::cout << "Condition notified." << std::endl;
    workThread.join();
    std::cout << "Thread finished." << std::endl;

    return 0;
}

ブースト条件変数の例

于 2014-09-18T13:44:21.733 に答える