Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是C+中的错误吗+;条件变量?_C++_Multithreading_Concurrency_Locking - Fatal编程技术网

C++ 这是C+中的错误吗+;条件变量?

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(标准::

以下是C++5.2.1的条件_变量头文件中的源代码。我想知道在第一次等待中是否有问题,while测试不在再次从等待中唤醒的锁的关键部分

模板
无效等待(_锁和_锁,_谓词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);
 }