gpt4 book ai didi

c++ - 两个条件变量和避免死锁

转载 作者:太空狗 更新时间:2023-10-29 20:28:44 26 4
gpt4 key购买 nike

我有两个条件变量:

CondVar1
CondVar2

像这样在两个线程中使用(伪代码):

// thread1 starts in 'waiting' mode, and then Thread2 signals
void Thread1()
{
CondVar1->Wait();
CondVar2->Signal();
}

void Thread2()
{
CondVar1->Signal();
CondVar2->Wait();
}

这会导致死锁吗?也就是说,thread1 等待,thread2 发信号,然后thread1 可以在thread2 进入Wait() 之前发信号,意味着thread2 永远不会返回?

谢谢

最佳答案

您通常不会等待条件变量。常见的使用模式是持有一个锁,检查一个变量来决定你是否可以继续,如果你不能在条件下等待:

// pseudocode
void push( T data ) {
Guard<Mutex> lock( m_mutex ); // Hold a lock on the queue
while (m_queue.full()) // [1]
m_cond1.wait(lock); // Wait until a consumer leaves a slot for me to write
// insert data
m_cond2.signal_one(); // Signal consumers that might be waiting on an empty queue
}

一些需要注意的事情:大多数库允许条件变量中的虚假唤醒。虽然可以实现避免虚假唤醒的条件变量,但操作成本会更高,因此要求用户在继续之前重新检查状态被认为是一种较小的邪恶(while 循环[1]).

一些库,尤其是 C++11,允许您传递谓词,并将在内部实现循环:cond.wait(lock, [&queue](){ return !queue.full(); } );

关于c++ - 两个条件变量和避免死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339837/

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