gpt4 book ai didi

c++ - 为什么 lock_guard 可以通过 unique_lock 得到一个已经锁定的互斥体? - 还有问题

转载 作者:行者123 更新时间:2023-11-28 06:06:23 24 4
gpt4 key购买 nike

我在学习this example .我找到了 this question并认为我会得到答案,但我仍然有一个问题。

为了方便起见,我把代码贴在这里:

std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;

void worker_thread()
{
// Wait until main() sends data
std::cout << "------------------------\n";
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return ready;});

// after the wait, we own the lock.
std::cout << "Worker thread is processing data\n";
data += " after processing";

// Send data back to main()
processed = true;
std::cout << "Worker thread signals data processing completed\n";

// Manual unlocking is done before notifying, to avoid waking up
// the waiting thread only to block again (see notify_one for details)
lk.unlock();
cv.notify_one();
}

int main()
{
std::thread worker(worker_thread);

data = "Example data";
// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one();

// wait for the worker
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return processed;});
}
std::cout << "Back in main(), data = " << data << '\n';

worker.join();

return 0;
}

不应该声明std::unique_lock<std::mutex> lk(m);阻塞主线程,因为 mutex mworker_thread 锁定?如果是,声明不是 cv.wait(lk, []{return processed;});在这个例子中不需要之后?当主线程可以锁定互斥锁时,processed将已经是真的。

最佳答案

调用 wait 会在等待期间解锁互斥量。参见 http://en.cppreference.com/w/cpp/thread/condition_variable/wait .

编辑:在您链接到的问题的答案中明确说明:https://stackoverflow.com/a/32030975/212870

编辑 2:“当主线程可以锁定互斥锁时,processed 已经为真”是不正确的。工作线程可能甚至还没有启动,或者即使已经启动它也可能没有看到 ready 已设置。

关于c++ - 为什么 lock_guard 可以通过 unique_lock 得到一个已经锁定的互斥体? - 还有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313096/

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