gpt4 book ai didi

c++ - 调用 condition_variable::wait() 时解锁的 unique_lock 会发生什么?

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

这是 C++ 引用网站上的示例代码

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

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) {
lck.unlock(); // by curiosity I unlock the lck
cv.wait(lck);
}
std::cout << "thread " << id << '\n';
}

void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
lck.unlock();
cv.notify_all();
}

int main() {
std::thread threads[10];
for (int i = 0; i < 10; ++i)
threads[i] = std::thread(print_id, i);
go();
for (auto &th : threads)
th.join();

return 0;
}

如果我在调用 wait() 之前不解锁 unique_lock,一切都会正常进行。喜欢:

thread 9
thread 1
thread 2
thread 3
thread 4
thread 5
thread 6
thread 7
thread 8
thread 0

有人告诉我

At the moment of blocking the thread, the function(wait()) automatically calls lck.unlock(), allowing other locked threads to continue.

所以我想知道如果我在调用 wait() 之前解锁 unique_lock 会怎么样。在我这样做之后,程序表现得很奇怪,只有一个或两个线程完成他们的工作(打印“线程 X”消息),其他线程似乎永远被阻止(被unique_lock?)。

那些 unique_locks 怎么了?或者这只是 c++ 在 wait() 之前调用 unlock() 的另一个未定义行为?

谢谢!

最佳答案

std::condition_variable::wait() 的文档中所述

Calling this function if lock.mutex() is not locked by the current thread is undefined behavior.

关于c++ - 调用 condition_variable::wait() 时解锁的 unique_lock 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903726/

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