这是线程安全测试的一部分.我在不同的线程中运行匿名lambda.
我使用变量i作为线程ID.
最初我通过main使用从范围传递了每个变量[&],但这会破坏堆.
现在通过传递i值来解决它,但是对于我的生活,我无法弄清楚为什么这会导致堆上的问题,因为线程只是读取i.
谁能解释一下?
产生错误的最小可编译示例:
#include <thread>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
vector<thread> threads;
vector<string> vec1;
vector<string> vec2;
for (int i = 0; i < 2; i++) {
threads.push_back(
thread([&vec1, &vec2, &i]() {
for (int j = 0; j < 10; j++) {
const string str = "foo";
if (i == 0) {
vec1.push_back(str);
} else {
vec2.push_back(str);
}
}
})
);
} …Run Code Online (Sandbox Code Playgroud)