为什么在相同的条件变量上使用多个互斥锁会使该代码崩溃?

在下面的代码(我尝试使其在最小程度上可验证)中,它可以正常运行并执行应做的工作(无论我在线程中传递的顺序如何,均按顺序打印1,2,3)。但是,如果我在函数三中注释的行中将m1更改为m2,则此代码将崩溃,并显示消息“在没有活动异常的情况下终止”。为什么不能使用相同的条件变量同时锁定两个不同的互斥锁?

#include <functional>
#include <mutex>
#include <condition_variable>
#include <future>
#include <iostream>

void printFirst() {
    cout << "1";
}

void printSecond() {
    cout << "2";
}

void printThird() {
    cout << "3";
}
struct test {

    condition_variable c,c2;
    int count = 0;
    mutex m1,m2;

void first(function<void()> printFirst) {
    printFirst();
    count++;
    c.notify_all();
}

void second(function<void()> printSecond) {
    unique_lock<mutex> sL1(m1);
    c.wait(sL1,[&]{return count>=1;});
    printSecond();
    count+=1;
    c.notify_all();
}

void third(function<void()> printThird) {
    unique_lock<mutex> sL2(m1); //If I make m1,m2,this code crashes
    c.wait(sL2,[&]{return count>=2;});
    printThird();
}
};
int main() {
    test t;

    function<void()> printFirstN =[&](){ t.first(printFirst);};
    function<void()> printSecondN=[&](){ t.second(printSecond);};
    function<void()> printThirdN=[&](){ t.third(printThird);};
    std::thread t1(printFirstN);
    std::thread t2( printThirdN);
    std::thread t3( printSecondN);
    t1.join();
    t2.join();
    t3.join();
}
jolon_zhang 回答:为什么在相同的条件变量上使用多个互斥锁会使该代码崩溃?

您不能这样做,因为C ++标准说您不能。

  

33.5.3类condition_variable [thread.condition.condvar]

     

避免等待(unique_lock&lock);

     

要求:lock.owns_lock()为true,lock.mutex()由   调用线程,或者

     

(9.1)-没有其他线程正在等待   condition_variable对象或

     

(9.2)— lock.mutex()返回相同   所有并发提供的每个锁参数的值   等待(通过wait,wait_for或wait_until)线程。

第二个子句强加要求,如果所有执行线程也阻塞在条件变量上,则它们必须锁定相同的互斥锁。

(上面的方法是wait方法,不需要任何其他参数,对所有重载/变量(包括您的代码所使用的载有谓词的变量)都重复相同的要求)。

本文链接:https://www.f2er.com/3148405.html

大家都在问