c++ - C++中的多线程:加入线程的正确方法
问题描述
我是多线程的新手,所以任何建议都将不胜感激。以下程序接受一个整数向量(例如 1 2 3 4 5 6 7)并将它们中的每一个作为线程处理。我想知道我加入线程的方法是否正确,是否可以进行任何改进。
我希望我的解释清楚!这是我的代码片段。这不是完整的代码,我只是确保我走的是正确的道路:
//vector's name is 'inputs' and it contains integers
for (int unsigned i = 0; i < inputs.size(); i++) {
thread thread_obj(thread_function, inputs.at(i));
thread_obj.detach();
}
for (int unsigned i = 0; i < inputs.size(); i++) {
thread_obj.join();
}
解决方案
您的代码具有未定义的行为,所以不,这是不正确的。这里的问题是你只能调用join()
if joinable()
istrue
并且因为你调用了detach()
,所以joinable()
会返回false
。
好消息是它确实是一个非常简单的修复。您只需要删除对detach
. 要完成代码,只需填充一个线程向量,然后像这样加入它们
std::vector<std::thread> threads;
threads.reserve(inputs.size());
for (int unsigned i = 0; i < inputs.size(); i++) {
threads.push_back(std::thread{thread_function, inputs.at(i)};
}
// now all threads are running, or waiting to run
for (int unsigned i = 0; i < inputs.size(); i++) {
threads[i].join();
}
// now all threads have been joined
推荐阅读
- java - MVEL 表达式:java.lang.ClassCastException:[B 不能转换为 java.lang.Object
- azure - Azure 数据工厂 V2:用于 SQL 合并的复制或存储过程活动
- .htaccess - 服务器端包括作为模板/布局技术
- php - 通过其他子数组值将多维子数组值相加
- ionic-framework - 离子文本字段中的重定向链接未在浏览器中打开
- python - 零维 numpy.ndarray :只有元素是二维数组:如何访问它?
- sql - 左连接 2 个表,结果看起来像内连接
- sapui5 - MessagePopover 片段中的动态链接未显示
- ssl - 如何在码头 9.3.12 中启用 ssl?
- bigdata - Azkaban 是大数据解决方案调度程序的好选择吗?