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
Multithreading 在notify_all()之后和wait()之前获得锁之间会发生什么?_Multithreading_C++11_Concurrency_Condition Variable - Fatal编程技术网

Multithreading 在notify_all()之后和wait()之前获得锁之间会发生什么?

Multithreading 在notify_all()之后和wait()之前获得锁之间会发生什么?,multithreading,c++11,concurrency,condition-variable,Multithreading,C++11,Concurrency,Condition Variable,我使用下面的代码测试std::condition\u变量: class CondWait{ public: std::condition_variable cv; std::mutex mu; int i=0; public: void mainTask(){ std::unique_lock<std::mutex> lk(mu); cv.wait(lk); i++; std::cout&

我使用下面的代码测试
std::condition\u变量

class CondWait{
public:
    std::condition_variable cv;
    std::mutex mu;
    int i=0;
public:
    void mainTask(){
        std::unique_lock<std::mutex> lk(mu);
        cv.wait(lk);
        i++;
        std::cout<<"main task, "<<i<<std::endl;
    }
    void notifyTask(){

        std::unique_lock<std::mutex> lk(mu);
        i = 0;
        std::cout<<"notify task, "<<i<<std::endl;
        cv.notify_one();
        std::cout<<"notify task, sleep 5 sec"<<std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
};
int main()
{
    CondWait condwait;
    std::thread t1(&CondWait::mainTask,&condwait);
    std::thread t2(&CondWait::notifyTask,&condwait);
    t1.join();
    t2.join();

    return 0;
}
有时,程序运行良好,即睡眠5秒后,它将输出
主任务,1
,完整输出为:

notify task, 0
notify task, sleep 5 sec
main task, 1

在我看来,在
notifyTask
线程中,在
notify\u one
之后仍然使用互斥锁,因此
mainTask
中的
wait
无法锁定互斥锁。但是我不知道接下来会发生什么,为什么这个例子会有不明确的表现。你能提供一些建议吗?非常感谢

由于您同时启动两个线程,可能会出现这样的情况:在
mainstask
中调用
cv.notify\u one()
之前调用
cv.wait()
,并且由于没有线程在等待,因此函数不执行任何操作。然后执行
wait()
并挂起等待通知

感谢您的回答,我在创建两个线程之间添加了一个延迟。结果证明你的答案是正确的。我想进一步询问为什么
wait()
可以等到
notifyTask
释放锁。我认为
wait
应该在执行
notify_all()
后尝试获取锁。
wait
在收到通知后立即尝试获取锁,但必须等到
notify
线程完成后释放锁
notify_one
不会自己释放它好的,我想我明白了。非常感谢你!
notify task, 0
notify task, sleep 5 sec
main task, 1