C++ 将2个指针传递给2个线程,但它们最终共享相同的指针

C++ 将2个指针传递给2个线程,但它们最终共享相同的指针,c++,multithreading,c++11,thread-safety,shared-ptr,C++,Multithreading,C++11,Thread Safety,Shared Ptr,我想这个问题已经出现了,它肯定显示了我在线程世界中的初学者水平,但我还没有找到任何以前的问题或其他资源来解决它。我已经看过了C++11线程最常见的介绍(例如,和),但是没有帮助 这是我的密码: mutex-mtx; 向量线程; 对于(vcit=vc.begin();vcit!=vc.end();++vcit){ const std::shared_ptr g=graphs.at(*vcit); coutlambda通过引用捕获g,这实际上是存储一个指向内存的指针,该内存只存在于for循环中。虽然

我想这个问题已经出现了,它肯定显示了我在线程世界中的初学者水平,但我还没有找到任何以前的问题或其他资源来解决它。我已经看过了C++11线程最常见的介绍(例如,和),但是没有帮助

这是我的密码:

mutex-mtx;
向量线程;
对于(vcit=vc.begin();vcit!=vc.end();++vcit){
const std::shared_ptr g=graphs.at(*vcit);

coutlambda通过引用捕获
g
,这实际上是存储一个指向内存的指针,该内存只存在于
for
循环中。虽然由于内存在堆栈上,所以它的行为没有定义,但很可能两个地址是相同的。因此,有时两个线程将读取相同的值,并且有些有时它们会读取不同的值,有时甚至会读取垃圾值。

您将指向
g
的指针传递给每个线程。这样所有线程都会收到指向同一变量的指针。因为您在执行时同时修改
g
,所以会得到不确定的响应。只需更改
[&g,&mgx]
[g和mtx]
来修复它。

我不理解C++11的所有内容,但似乎您正在将
&g
传递给线程,但是
g
是一个在循环结束时被销毁的对象。因此,行为未定义。令人印象深刻的是,错误是多么基本,但我被线程的新颖性迷住了,并将注意力集中在了某个地方se!:)“…通常的风格是在创建共享的\u ptr时为其提供一个新的堆对象”您的解释非常有道理。谢谢。
Graph (outside thread): ABC
Graph (outside thread): DEF
Graph (inside thread): DEF
Graph (inside thread): DEF
Graph (outside thread): ABC
Graph (inside thread): ABC
Graph (outside thread): DEF
Graph (inside thread): DEF