繁体   English   中英

condition_variable事件notifyAndWait()

[英]condition_variable event notifyAndWait()

我有一个循环等待事件。

我希望能够添加notifyAndWait()函数

我不确定如何将其添加到当前课程中

class Event
{
public:

    Event() : _signalled(false) {}

    void notify()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _signalled = true;
        _condvar.notify_one();
    }

    void wait()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _condvar.wait(lock, [&] { return _signalled; }); // also takes care about spurious wakeup
        _signalled = false; // auto-reset semantics
    }

private:

    std::mutex _mutex;
    std::condition_variable _condvar;
    bool _signalled;
};

您可以使用相同的条件变量 ,使用不同的标志将信号传递回调用线程。 像这样:

class Event
{
public:

    Event() : _signalled(false) {}

    void notify()
    {
        std::cout << "notifying" << '\n' << std::flush;

        {
            std::unique_lock<std::mutex> lock(_mutex);
            _completed = false;
            _signalled = true;
        }

        _condvar.notify_one();

        {
            // now wait for completion
            std::unique_lock<std::mutex> lock(_mutex);
            _condvar.wait(lock, [&] { return _completed; });
        }

        std::cout << "completed" << '\n' << std::flush;
    }

    void wait()
    {
        {
            std::unique_lock<std::mutex> lock(_mutex);
            _condvar.wait(lock, [&] { return _signalled; });
            _signalled = false;
        }

        // do stuff

        auto n = hol::random_number(10);

        std::cout << "doing " << n << " different things" << std::flush;
        for(int i = 0; i < n; ++i)
        {
            std::cout << '.' << std::flush;
            std::this_thread::sleep_for(std::chrono::milliseconds(hol::random_number(3000)));
        }
        std::cout << " done stuff" << '\n' << std::flush;

        {
            std::unique_lock<std::mutex> lock(_mutex);
            _completed = true;
        }

        _condvar.notify_one();
    }

private:

    std::mutex _mutex;
    std::condition_variable _condvar;
    bool _signalled;
    bool _completed;
};

int main()
{
    Event e;

    std::thread wait([&]{ e.wait(); });

    e.notify();

    wait.join();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM