首页 > 解决方案 > C++ - thread_local 向量导致 join() 崩溃

问题描述

编辑:在最初的问题中, thread_array 被声明为vector<thread> thread_array(4);而不是vector<thread> thread_array;,这导致了一个错误 - 现在已经编辑了,但问题仍然存在。

来自这个问题:C++ 程序在 join()-ing 线程时有时会崩溃

我设法将其缩小到这个非常简单的程序,希望您可以轻松编译和运行:

#include <thread>
#include <vector>
using namespace std;

thread_local vector<int> v;

void foo(int n) 
{  
    for(int i=0 ; i<n ; i++)
        v.push_back(i);
}

int main() 
{
    vector<thread> thread_array;
    for(int i=0 ; i<4 ; i++)
        thread_array.push_back(thread(foo,100));
    for(int i=0 ; i<4 ; i++)
        thread_array.at(i).join();
    return 0;
}

为什么这个程序在到达第二个 for 循环(加入循环)后会崩溃?这是一个 MinGW 错误吗?据我所知,我不应该对 thread_local 向量做任何额外的事情。如果需要,我可以发布细节。

标签: c++c++11concurrencymingw

解决方案


thread_array实际上包含 8 个对象。std::thread由添加的 4 个默认构造vector<thread> thread_array(4);push_back之后的 4 个。在您的第二个循环中,您尝试使用join不可连接的默认构造的。

要解决这个问题,只需不要添加 4 个默认构造的线程,而是使用push_back

int main() 
{
    vector<thread> thread_array; // <-- remove (4) from here
    for(int i=0 ; i<4 ; i++)
        thread_array.push_back(thread(foo,100));
    for(int i=0 ; i<4 ; i++)
        thread_array.at(i).join();
    return 0;
}

或者,您可以分配给 4 个默认构造的:

int main()
{
    vector<thread> thread_array(4);
    for (auto & worker : thread_array)
        worker = thread(foo, 100);
    for (auto & worker : thread_array)
        worker.join();
    return 0;
}

推荐阅读