小编Nim*_*rag的帖子

通过引用几个线程传递变量会破坏堆

这是线程安全测试的一部分.我在不同的线程中运行匿名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)

c++ lambda multithreading pass-by-reference c++11

2
推荐指数
1
解决办法
137
查看次数

标签 统计

c++ ×1

c++11 ×1

lambda ×1

multithreading ×1

pass-by-reference ×1