C++中的多线程:连接线程的正确方法

Multithreading in C++: The correct way to join threads

本文关键字:线程 连接线 方法 连接 多线程 C++      更新时间:2023-10-16

我是多线程的新手,所以任何建议将不胜感激。以下程序接收整数向量(例如 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();
}


您的代码具有未定义的行为,因此不,这是不正确的。 这里的问题是,只有在joinable()true并且因为您调用了detach()joinable()才能调用join(),因此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