首页 > 解决方案 > 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();
    }
   
    

标签: c++multithreadingc++11thread-safety

解决方案


您的代码具有未定义的行为,所以不,这是不正确的。这里的问题是你只能调用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

推荐阅读