C++ 使用std::thread使用Visual Studio 2015执行lambda函数时崩溃

C++ 使用std::thread使用Visual Studio 2015执行lambda函数时崩溃,c++,windows,visual-c++,stl,C++,Windows,Visual C++,Stl,我有这个函数,试着忽略参数和变量的类型。我绝对确信对象仍然存在(在调用此函数之前,它们是在同一线程上创建的) 现在的问题是,在某些构建中,生成的程序偶尔会在新创建的线程上崩溃,就在这里: std::thread t{ [&]() { while (mustContinue) RunNewConnectionsSet(Controller, m_connectionNumber, m_dataSize); } }; 这是崩溃发生时的调用堆栈(我去掉了参数和其他不必要的信息): 您

我有这个函数,试着忽略参数和变量的类型。我绝对确信对象仍然存在(在调用此函数之前,它们是在同一线程上创建的)

现在的问题是,在某些构建中,生成的程序偶尔会在新创建的线程上崩溃,就在这里:

std::thread t{ [&]() {
while (mustContinue)
    RunNewConnectionsSet(Controller, m_connectionNumber, m_dataSize);
} };
这是崩溃发生时的调用堆栈(我去掉了参数和其他不必要的信息):


您的代码具有未定义的行为。您需要为
mustContinue
@NathanOliver提供同步,它在哪里说这是未定义的行为?你能给我标准中的链接吗?或者你能详细说明一下吗?我不明白它怎么会出错,因为最终它只是一个
mov
cmp
之类的东西。@Alexandrubrindus这是一个数据竞争,这是未定义的行为。从不同线程写入和读取未同步的变量是未定义的行为,句号。如果你认为自己比编译器更聪明(“它只是一个
mov
cmp
”),你会伤到自己。我推荐阅读。现在,这个
mustContinue
的东西可能不是崩溃的原因(你可以把它变成
std::atomic来修复它),但是公然无视同步可能是错误的。@MaxLanghof我从来没有想到编译器会出这么大的错误,因为我写的变量被另一个线程读取,而没有在那里添加“锁”。我可以理解这样一个事实:即使在
true
赋值之后,一个线程也可以读取
false
,但是程序崩溃了100%。
std::thread t{ [&]() {
while (mustContinue)
    RunNewConnectionsSet(Controller, m_connectionNumber, m_dataSize);
} };
vrfcore!VerifierStopMessageEx+0x6d0
vfbasics!AVrfpCheckFirstChanceException+0xa2
vfbasics!AVrfpVectoredExceptionHandler+0x1a
ntdll!RtlpCallVectoredHandlers+0xe6
ntdll!RtlDispatchException+0x63
ntdll!KiUserExceptionDispatch+0x3a (TrapFrame @ 00000001`4617f9e8)
0x00000001`43a25f50
dci_tester!std::_Invoker_functor::_Call+0x6
dci_tester!std::invoke+0x6 (Inline Function @ 00007ff6`2fa1b6cf)
dci_tester!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void *),void *>,std::default_delete<std::tuple<void (__cdecl*)(void *),void *> > > >::_Execute+0x6 
dci_tester!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void * __ptr64),void * __ptr64>,std::default_delete<std::tuple<void (__cdecl*)(void * __ptr64),void * __ptr64> > > >::_Run+0x6f 
dci_tester!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl*)(void *),void *>,std::default_delete<std::tuple<void (__cdecl*)(void *),void *> > > >::_Go+0x5 
dci_tester!std::_Pad::_Call_func+0x9
dci_tester!invoke_thread_procedure+0xe (Inline Function @ 00007ff6`2fbcd91d)
dci_tester!thread_start<unsigned int (__cdecl*)(void * __ptr64)>+0x5d
vfbasics!AVrfpStandardThreadFunction+0x4d
KERNEL32!BaseThreadInitThunk+0x22
ntdll!RtlUserThreadStart+0x34
ntdll!NtWaitForSingleObject+0x14
KERNELBASE!WaitForSingleObjectEx+0x9f
dci_tester!cppdex::WindowsSyncEvent::WaitForSignal+0x2e 
dci_tester!cppdex::testing::IpcDispatcher::WaitForSignalFromProcess+0x25 
dci_tester!MasterIPC::WaitForAllClients+0x4d 
dci_tester!dci_tester::testcases::ClientLoadUnloadStressTestcase::RunMasterForScenarioOverTimeWithAllConnections+0xa2 
dci_tester!dci_tester::testcases::ClientLoadUnloadStressTestcase::ConnectionsMasterProcessRoutine+0x1d1 
dci_tester!dci_tester::testcases::DciMultiProcessTestcase::ProcessRoutine+0x1c1 
dci_tester!cppdex::testing::MultiProcessTestcase::Run+0x6b
dci_tester!cppdex::testing::TestcaseManager<cppdex::testing::TestcaseDefaultCommandParser>::RunTestcase+0x175
dci_tester!ExecutableMain+0x64a
dci_tester!wmain+0x68
dci_tester!invoke_main+0x22
dci_tester!__scrt_common_main_seh+0x11d
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21