gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:30:26 24 4
gpt4 key购买 nike

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

这是我的代码:

mutex mtx;
vector<thread> threads;

for(vcit = vc.begin(); vcit != vc.end(); ++vcit) {
const std::shared_ptr<Graph> g = graphs.at(*vcit);

cout << "Graph (outside thread): " << g->name << endl;
threads.push_back(thread(
[&g, &mtx] () {
lock_guard<mutex> guard(mtx);
cout << "Graph (inside thread): " << g->name << endl;
}
));
}

for(thread& t : threads) {
t.join();
}

我希望每个线程接收一个不同的指针,但程序的输出如下(对于 vector vc 中的 2 个元素):

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

(注意现在从外部和内部输出的混合顺序)。我试图从 lambda 转移到仿函数对象,但这没有帮助,程序表现出相同的行为。

我想知道代码的问题出在哪里,以及我对线程(或 shared_ptr 的可能)工作方式的理解哪里有缺陷,如果这可以从代码中推断出来的话。

最佳答案

lambda 通过引用捕获 g,这实际上是存储指向内存的指针,该指针仅存在于 for 循环中。尽管由于内存在堆栈上而未定义行为,但两个地址很可能是相同的。因此,有时这两个线程会读取相同的值,有时它们会读取不同的值 - 有时它们甚至会读取垃圾值。

关于c++ - 将 2 个指针传递给 2 个线程,但它们最终共享相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com