我遇到一些无法理解的条件变量及其与互斥体的使用,我希望社会能够帮助我。 请注意,我来自一个Win32的背景,所以我与CRITICAL_SECTION使用,手柄,SetEvent的,WaitForMultipleObject等。
下面是在并发使用C ++ 11标准库中我第一次尝试,这是一个修改后的版本在这里找到程序示例 。
#include <condition_variable>
#include <mutex>
#include <algorithm>
#include <thread>
#include <queue>
#include <chrono>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::queue<unsigned int> nNumbers;
std::mutex mtxQueue;
std::condition_variable cvQueue;
bool m_bQueueLocked = false;
std::mutex mtxQuit;
std::condition_variable cvQuit;
bool m_bQuit = false;
std::thread thrQuit(
[&]()
{
using namespace std;
this_thread::sleep_for(chrono::seconds(7));
// set event by setting the bool variable to true
// then notifying via the condition variable
m_bQuit = true;
cvQuit.notify_all();
}
);
std::thread thrProducer(
[&]()
{
using namespace std;
int nNum = 0;
unique_lock<mutex> lock( mtxQuit );
while( ( ! m_bQuit ) &&
( cvQuit.wait_for( lock, chrono::milliseconds(10) ) == cv_status::timeout ) )
{
nNum ++;
unique_lock<mutex> qLock(mtxQueue);
cout << "Produced: " << nNum << "\n";
nNumbers.push( nNum );
}
}
);
std::thread thrConsumer(
[&]()
{
using namespace std;
unique_lock<mutex> lock( mtxQuit );
while( ( ! m_bQuit ) &&
( cvQuit.wait_for( lock, chrono::milliseconds(10) ) == cv_status::timeout ) )
{
unique_lock<mutex> qLock(mtxQueue);
if( nNumbers.size() > 0 )
{
cout << "Consumed: " << nNumbers.front() << "\n";
nNumbers.pop();
}
}
}
);
thrQuit.join();
thrProducer.join();
thrConsumer.join();
return 0;
}
这个几个问题。
我读过 “称,拟向等待STD任何线程:: condition_variable必须首先获得一个std :: unique_lock。”
所以我有一个{退出互斥,条件变量与布尔}指示何时戒烟已经发出信号。 生产者和消费者线程必须在每次获取的std :: unique_lock像这样:
std::unique_lock<std::mutex> lock(m_mtxQuit);
这是混淆了我的地狱。 这会不会锁定在第一个线程退出互斥体,从而阻断第二? 如果这是真的,那么如何在第一个线程释放锁,以便其他线程可以开始?
另一个问题是:如果我改变wait_for()调用等待零秒,该线程饿死。 有人能解释一下吗? 我希望它不会执行while循环之前阻止(我是正确的假设,一个是了no_timeout的recv'd代替超时?)。
我怎么能叫一个wait_for(),并指定一个零时间,使wait_for()调用不会阻塞,而是只检查病情,并继续?
我也很想听到关于这个问题的很好的参考。