gpt4 book ai didi

c++ - 程序在 C++11 中使用条件变量进入死锁

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

我目前正在尝试学习如何使用 condition_variable 进行线程同步。为了进行测试,我制作了如下所示的演示应用程序。当我启动它时,它遇到了死锁。我知道发生这种情况的位置,但我无法理解为什么会发生死锁。

我知道 condition_variablewait 函数会在条件不为真时自动解锁互斥锁,所以主线程不应该在第二遍中被阻塞.但这就是发生的事情。

谁能解释一下为什么?

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

bool flag = false;
std::mutex g_mutex;
std::condition_variable cv;


void threadProc()
{
std::unique_lock<std::mutex> lck(g_mutex);

while (true)
{
static int count = 0;

std::cout << "wait for flag" << ++count << std::endl;

cv.wait(lck, []() {return flag; }); // !!!It will blocked at the second round

std::cout << "flag is true " << count << std::endl;

flag = false;
lck.unlock();
}

}

int main(int argc, char *argv[])
{
std::thread t(threadProc);

while (true)
{
static int count = 0;

{
std::lock_guard<std::mutex> guard(g_mutex); // !!!It will blocked at the second round

flag = true;
std::cout << "set flag " << ++count << std::endl;
}

cv.notify_one();

std::this_thread::sleep_for(std::chrono::seconds(1));
}


t.join();

return 0;
}

最佳答案

I know that a condition_variable's wait function will automatically unlock the mutex when the condition is not true.

嗯...,是的...,为了绝对清楚,cv.wait(lck, f) 这样做:

while(! f()) {
cv.wait(lck);
}

每次调用 cv.wait(lck) 都会;

  • 解锁lck,
  • 等到其他线程调用 cv.notify_one()cv.notify_all()
  • 重新锁定lck,然后
  • 返回。

关于c++ - 程序在 C++11 中使用条件变量进入死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828838/

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