gpt4 book ai didi

c++ - 循环内的c++线程会打印错误的值

转载 作者:行者123 更新时间:2023-12-01 09:01:24 24 4
gpt4 key购买 nike

我试图理解c++中的多线程,但是我陷入了这个问题:如果我在for循环中启动线程,它们会打印错误的值。这是代码:

#include <iostream>
#include <list>
#include <thread>

void print_id(int id){
printf("Hello from thread %d\n", id);
}

int main() {
int n=5;
std::list<std::thread> threads={};
for(int i=0; i<n; i++ ){
threads.emplace_back(std::thread([&](){ print_id(i); }));
}
for(auto& t: threads){
t.join();
}
return 0;
}

我原本希望得到的值分别为0、1、2、3、4,但我经常两次得到相同的值。这是输出:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5

我想念的是什么?

最佳答案

[&]语法导致i被引用捕获。因此,当线程运行时,i通常会比您预期的更高级。更严重的是,如果在线程运行之前i超出范围,则代码的行为是不确定的。

按值捕获i-即std::thread([i](){ print_id(i); })是解决方法。

关于c++ - 循环内的c++线程会打印错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60093210/

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