gpt4 book ai didi

c++ - 带有 lambda [&] 的线程导致神秘的结果

转载 作者:太空狗 更新时间:2023-10-29 23:50:35 25 4
gpt4 key购买 nike

我目前正在开发一个多线程服务器(使用 c++14),我面临着一个奇怪的问题,让我解释一下:

所以在这里我只是用 lambda 表达式创建 nb_threads 线程并将它们放在 forward_list 中:

unsigned nb_threads = 4;
std::forward_list<std::thread> threads;

for (unsigned i = 0; i < nb_threads; ++i)
threads.emplace_front(std::thread(
[i, this]()
{
std::cout << "Thread " << i + 1 << " launched!" << std::endl;
}));

这在标准输出上给出了这个结果(正确):

Thread 2 launched!
Thread 3 launched!
Thread 4 launched!
Thread 1 launched!

现在让我们在 lambda 表达式中将 [i, this] 更改为 [&]:

for (unsigned i = 0; i < nb_threads; ++i)
threads.emplace_front(std::thread(
[&]()
{
std::cout << "Thread " << i + 1 << " launched!" << std::endl;
}));

这现在在标准输出上给了我这个结果(这真的神秘!):

Thread 2 launched!
Thread 1 launched!
Thread 1 launched!
Thread 1 launched!

所以我的问题是发生了什么?为什么我不能更改[&]

最佳答案

竞争条件

当通过引用捕获 i 时,这里发生的是 数据竞争。当通过引用捕获时,每个 lambda 将获得与通过引用捕获的变量相同的内存位置的引用。

基本上发生的事情是主线程正在写入 i 而派生线程正在尝试从同一个变量中读取,没有同步。

在不同步的情况下同时对同一内存位置执行读取和写入将导致数据竞争并表现出不确定的行为。

关于c++ - 带有 lambda [&] 的线程导致神秘的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732083/

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