gpt4 book ai didi

c++11 - std::condition_variable为什么需要std::mutex

转载 作者:行者123 更新时间:2023-12-04 17:45:15 26 4
gpt4 key购买 nike

我不确定我是否真的了解std::condition_variable为什么需要额外的std::mutex作为参数?它不应该被自己锁定吗?

#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>

std::condition_variable cv;
std::mutex cv_m;
int i = 0;
bool done = false;

void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
std::cout << "Waiting... \n";
cv.wait(lk, []{return i == 1;});
std::cout << "...finished waiting. i == 1\n";
done = true;
}

void signals()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Notifying falsely...\n";
cv.notify_one(); // waiting thread is notified with i == 0.
// cv.wait wakes up, checks i, and goes back to waiting

std::unique_lock<std::mutex> lk(cv_m);
i = 1;
while (!done)
{
std::cout << "Notifying true change...\n";
lk.unlock();
cv.notify_one(); // waiting thread is notified with i == 1, cv.wait returns
std::this_thread::sleep_for(std::chrono::seconds(1));
lk.lock();
}
}

int main()
{
std::thread t1(waits), t2(signals);
t1.join();
t2.join();
}

其次,在该示例中,它们首先解锁互斥锁( signals方法)。他们为什么要这样做?他们不应该先锁定然后在通知后解锁吗?

最佳答案

互斥量可保护谓词,即您正在等待的事物。由于您正在等待的事物必须在线程之间共享,因此必须以某种方式对其进行保护。
在上面的示例中,i == 1是谓词。互斥锁保护i
退后一步,考虑一下为什么需要条件变量可能会有所帮助。一个线程检测到某种阻止其前进的状态,需要等待其他线程更改该状态。状态检测必须在互斥锁下进行,因为必须共享状态(否则,另一个线程将如何更改该状态?)。
但是线程无法释放互斥对象,然后等待。如果状态在互斥体释放后但线程设法等待之前发生了变化,该怎么办?因此,您需要原子性的“解锁并等待”操作。这就是条件变量所提供的。
没有互斥锁,他们将解锁什么?
在释放锁定之前还是之后发出信号通知条件变量的选择是一个复杂的工作,具有双方的优势。一般来说,如果在按住锁的同时发出信号,将会获得更好的性能。

关于c++11 - std::condition_variable为什么需要std::mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37180547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com