c++ - 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 向量做任何额外的事情。如果需要,我可以发布细节。
解决方案
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;
}
推荐阅读
- python - Python3如何
--export my_image.eps 命令字? - javascript - 谷歌表格脚本 - 目标范围内的粗体字
- java - java.lang.IllegalStateException: 不能(转发 | sendRedirect JSP/Java
- regex - Telegram Bot - 从消息中删除/忽略链接
- r - R和过滤器,rbind
- delphi - Delphi - 计算亚马逊 MWS 签名
- go - 如何解析具有一个标签的基本 XML 数据
- javascript - 尝试升级旧的hammer.js (v1.0.5) 脚本。在 iOS 上垂直滚动时遇到问题
- python - 如何在 tensorflow.keras 中实现 AttentionDecoder?
- python - 获取一个数据框列相对于另一个数据框列值的值