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