【问题标题】:waiting on past events等待过去的事件
【发布时间】:2016-03-16 13:08:27
【问题描述】:

我有一个带有两个方法的测试类的 C++ 程序:

void IntegrationTestBase::wait_test_end() {
    unique_lock<mutex> lock(m_mutex);

    m_cond.wait(lock);
}

void IntegrationTestBase::notify_test_end() {
    XN_LOGF_ITEST_BASE(INFO, "Test end");

    m_cond.notify_all();

m_cond 是条件变量,m_mutex 是互斥体。

流程是未知数量的线程可能wait_test_end,然后其他一些线程可能notify_test_end,它们都将停止等待。

问题是在notify_test_end 之后,其他一些线程可能会wait_test_end 并且它们将无限期地卡在等待中。

我该如何应对?

【问题讨论】:

  • 我发现this post 在寻找一个好例子时很有用。

标签: c++ multithreading concurrency


【解决方案1】:

处理它的方法是了解条件变量是什么,不是什么。特别是,它不是一个单一的机制。

条件变量保护某个资源(例如一个真实变量)。使用它的模式总是一样的:

  1. 锁定互斥锁
  2. 检查实变量,看它是否包含您感兴趣的值
  3. 如果不是,请等待条件变量 - 如果是,请使用该变量并解锁互斥锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多