c++ - 使用 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);
}
}
解决方案
条件变量是无状态的。它们没有“信号”状态或它们自己的任何状态。
要等待某事,您需要状态。您需要知道您正在等待的事情是否已经发生(因此您不需要等待或可以停止等待)或没有(在这种情况下您需要等待)。没有某种状态,您无法决定是否等待。
同样,条件变量是无状态的。所以状态不在条件变量中。
状态需要共享。它需要被等待事情发生的线程访问(决定是否等待以及何时停止等待)和指示事情发生的线程(这样它可以告诉其他线程不要等待或停止等待)停止等待)。因此,它必须以某种方式同步。
现在,你有一点问题。考虑:
- 您获得了保护共享状态的锁。
- 你等待的事情还没有发生。
- 你等待。
糟糕,其他线程无法更改共享状态,因为您对其进行了锁定。让我们再试一次。
也许:
- 您获得了保护共享状态的锁。
- 你等待的事情还没有发生。
- 你松开锁。
- 你等待。
哎呀。如果在第 3 步之后但在第 4 步之前,另一个线程获取锁、更改共享状态、向条件变量发出信号并释放锁怎么办?你现在正在等待已经发生的事情。(请记住,条件变量是无状态的,不会更改为“信号”状态。)
为了解决这个问题,条件变量提供了一个原子的“解锁并等待”操作,它以原子方式执行步骤 3 和 4。这仅在与条件变量关联的互斥锁保护共享状态时才有效。
推荐阅读
- c# - .NET 项目中 64 位版本 DLL 的要求
- asp.net-core - 应用程序池回收期间 IIS 中的 ASP.NET Core 顺序重启
- javascript - Google 分析如何查看所有用户的列表
- javascript - 使用 moment.js 识别第二个/第三个星期六
- azure - 电子邮件未到达 Microsoft azure 托管网站
- python - 使用python字典列表批量更新表中的特定列(不是全部)
- deep-learning - 如何在没有 GPU 的情况下提供深度学习模型
- python-3.x - 检测标点符号后的缺失空格和标点符号前的空格
- html - 在 bigbluebutton 源代码的 HTML 5 客户端中更改房间的 html 代码?
- android - 即使在服务中尝试了许多解决方案,获取上下文也是空点异常