C++ 这是C+中的错误吗+;条件变量?
以下是C++5.2.1的条件_变量头文件中的源代码。我想知道在第一次等待中是否有问题,while测试不在再次从等待中唤醒的锁的关键部分C++ 这是C+中的错误吗+;条件变量?,c++,multithreading,concurrency,locking,C++,Multithreading,Concurrency,Locking,以下是C++5.2.1的条件_变量头文件中的源代码。我想知道在第一次等待中是否有问题,while测试不在再次从等待中唤醒的锁的关键部分 模板 无效等待(_锁和_锁,_谓词p){ 而(!\uuu p()) 等待(锁定); } 模板 无效等待(锁定和锁定){ 共享的\u ptr\u互斥体=\u M\u互斥体; 唯一锁uu我的锁(*u互斥锁); _解锁-解锁(锁定); //*\uuuu互斥锁必须在重新锁定前解锁\uuuu锁以便移动 //对生命周期较短的对象拥有*_互斥锁。 唯一锁定我的锁定2(标准::
模板
无效等待(_锁和_锁,_谓词p){
而(!\uuu p())
等待(锁定);
}
模板
无效等待(锁定和锁定){
共享的\u ptr\u互斥体=\u M\u互斥体;
唯一锁uu我的锁(*u互斥锁);
_解锁-解锁(锁定);
//*\uuuu互斥锁必须在重新锁定前解锁\uuuu锁以便移动
//对生命周期较短的对象拥有*_互斥锁。
唯一锁定我的锁定2(标准::移动(uuu我的锁定));
_第二次等待(我的锁2);
}
不是一个bug。当<代码>__p()被计算,\u lock
中的互斥锁被认为仍然被当前线程锁定
我假设代码来自libstdc++。查找
\u Unlock
的功能。它只需调用Unlock显式解锁(\u Lock&\u lk):\u M_Lock(\u lk){u_lk.Unlock()}
和析构函数呢?是的,我忽略了析构函数,那里的u锁被重新锁定了!当用户调用上一个等待时,保持_锁,但在实际阻塞之前在瓶子中释放_锁,并且当线程唤醒以再次计算_p()时,不会重新锁定_锁。有什么问题吗?在libstdc++的源代码中,我发现\u Unlock
的析构函数试图重新锁定互斥锁。
template<typename _Lock, typename _Predicate>
void wait(_Lock& __lock, _Predicate __p) {
while (!__p())
wait(__lock);
}
template<typename _Lock>
void wait(_Lock& __lock) {
shared_ptr<mutex> __mutex = _M_mutex;
unique_lock<mutex> __my_lock(*__mutex);
_Unlock<_Lock> __unlock(__lock);
// *__mutex must be unlocked before re-locking __lock so move
// ownership of *__mutex lock to an object with shorter lifetime.
unique_lock<mutex> __my_lock2(std::move(__my_lock));
_M_cond.wait(__my_lock2);
}