Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++_Multithreading - Fatal编程技术网

C++ 为什么使用多互斥锁';在相同的条件下,这个代码会崩溃吗?

C++ 为什么使用多互斥锁';在相同的条件下,这个代码会崩溃吗?,c++,multithreading,C++,Multithreading,在下面的代码中,我试图使其最小可验证,运行良好,并执行它应该执行的操作(无论我在线程中传递的顺序是什么,都按顺序打印1,2,3)。但是,如果我在第三个函数中注释的行中将m1更改为m2,则此代码将崩溃,并显示消息“terminated without a active exception”。为什么不能使用相同的条件变量同时锁定两个不同的互斥锁 #include <functional> #include <mutex> #include <condition_vari

在下面的代码中,我试图使其最小可验证,运行良好,并执行它应该执行的操作(无论我在线程中传递的顺序是什么,都按顺序打印1,2,3)。但是,如果我在第三个函数中注释的行中将m1更改为m2,则此代码将崩溃,并显示消息“terminated without a active exception”。为什么不能使用相同的条件变量同时锁定两个不同的互斥锁

#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();
}
#包括
#包括
#包括
#包括
#包括
void printFirst(){

你不能这么做,因为C++标准说你不能。< /P> 33.5.3类条件_变量[thread.condition.condvar]

无效等待(唯一锁定和锁定)

Requires:lock.owns\u lock()为true,lock.mutex()由 调用线程,并且

(9.1)-没有其他线程在此线程上等待 条件_变量对象或

(9.2)-lock.mutex()返回相同的 由all提供的每个锁参数的值 正在等待(通过等待、等待或等待)线程

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


(以上是对于不使用附加参数的代码>等待<代码>方法,对于所有重载/变化,同样的要求重复,包括代码使用的谓词)。

< P>你不能这么做,因为C++标准说你不能。 33.5.3类条件_变量[thread.condition.condvar]

无效等待(唯一锁定和锁定)

Requires:lock.owns\u lock()为true,lock.mutex()由 调用线程,并且

(9.1)-没有其他线程在此线程上等待 条件_变量对象或

(9.2)-lock.mutex()返回相同的 由all提供的每个锁参数的值 正在等待(通过等待、等待或等待)线程

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


(以上是针对不带额外参数的
wait
方法,对所有重载/变体重复相同的要求,包括代码使用的带谓词的重载/变体).

暂时忽略崩溃,如果您想让3个线程连续运行,那么首先使用2个互斥体是没有意义的,只使用1个互斥体。使用2个互斥体将允许2个线程同时运行,从而使您的serialization@RemyLebeau同意。这只是一个玩具程序,旨在突出我在一段更大的代码中遇到的问题:)暂时忽略崩溃,如果您想让3个线程连续运行,那么首先使用2个互斥体(仅1个互斥体)是没有意义的。使用2个互斥体将允许2个线程同时运行,从而使您的serialization@RemyLebeau同意。这只是一个玩具程序,旨在突出我在一段更大的代码中遇到的问题:)