首页 > 解决方案 > 使用 std::condition_variable 触发其他线程。使用哪些互斥锁?

问题描述

我正在尝试制作一个触发另一个线程的线程。但是,我不知道如何使用互斥锁。我不明白为什么需要互斥锁,因为我不使用共享变量。因此我不明白哪些互斥锁进入了哪个线程。

void readLoop()
    {
        while (true)
        {
            std::unique_lock<std::mutex> lock(readThreadMutex);
            writeConditionVariable.wait(lock);
        }
    }

void writeLoop()
    {
        while (true)
        {
            std::unique_lock<std::mutex> lock(readThreadMutex);
            readConditionVariable.wait(lock);
        }
    }

标签: c++

解决方案


条件变量是无状态的。它们没有“信号”状态或它们自己的任何状态。

要等待某事,您需要状态。您需要知道您正在等待的事情是否已经发生(因此您不需要等待或可以停止等待)或没有(在这种情况下您需要等待)。没有某种状态,您无法决定是否等待。

同样,条件变量是无状态的。所以状态不在条件变量中。

状态需要共享。它需要被等待事情发生的线程访问(决定是否等待以及何时停止等待)和指示事情发生的线程(这样它可以告诉其他线程不要等待或停止等待)停止等待)。因此,它必须以某种方式同步。

现在,你有一点问题。考虑:

  1. 您获得了保护共享状态的锁。
  2. 你等待的事情还没有发生。
  3. 你等待。

糟糕,其他线程无法更改共享状态,因为您对其进行了锁定。让我们再试一次。

也许:

  1. 您获得了保护共享状态的锁。
  2. 你等待的事情还没有发生。
  3. 你松开锁。
  4. 你等待。

哎呀。如果在第 3 步之后但在第 4 步之前,另一个线程获取锁、更改共享状态、向条件变量发出信号并释放锁怎么办?你现在正在等待已经发生的事情。(请记住,条件变量是无状态的,不会更改为“信号”状态。)

为了解决这个问题,条件变量提供了一个原子的“解锁并等待”操作,它以原子方式执行步骤 3 和 4。这仅在与条件变量关联的互斥锁保护共享状态时才有效。


推荐阅读