C++11——多线程编程14 如何创建线程对象的向量?
翻译来自:https://thispointer.com/c11-how-to-create-vector-of-thread-objects/
让我们创建一个 std::thread 对象的向量,即
// 创建一个线程向量 std::vector < std::thread > vecOfThreads;
现在让我们创建一个 std::function<> 对象,我们将把它作为线程函数传递给线程对象,即
// 创建一个函数对象 std::function < void ()> func = []() { //做一些重要的工作 // ..... //打印线程ID std::cout << "来自线程 ID :" << std::this_thread:: get_id () << "\n" ; } ;
现在让我们使用这个 std::function 对象创建 2 个线程对象,即
std::thread th1 ( func ) ;
std::thread th2 ( func ) ;
现在,由于 std::thread 对象只能移动,即我们不能复制它们,只能移动它们。因此,我们需要在向量中移动这两个线程对象,即
// 将线程对象移动到向量 vecOfThreads.push_back ( std:: move ( th1 )) ; vecOfThreads.push_back ( std:: move ( th2 )) ;
我们也可以在不特别指定 std::move() 的情况下推送 std::thread,如果我们将它们作为右值传递,即
// 添加一个线程对象到向量
vecOfThreads.push_back ( std:: thread ( func )) ;
由于vector包含各种线程对象,所以当这个vector对象被析构时,它会调用vector中所有线程对象的析构函数。
如果任何被破坏的线程对象是可连接的但未连接,则 std::terminate() 将从其析构函数中调用。因此有必要在向量被破坏之前加入向量中的所有可连接线程,即
// Iterate over the thread vector for (std::thread & th : vecOfThreads) { // If thread Object is Joinable then Join that thread. if (th.joinable()) th.join(); }
#include <thread> #include <vector> #include <iostream> #include <functional> int main() { // 创建一个线程向量 std::vector<std::thread> vecOfThreads; // 创建一个函数对象 std::function<void()> func = []() { //做一些重要的工作 // ..... //打印线程ID std::cout << "From Thread ID : " << std::this_thread::get_id() << "\n"; }; // 添加一个线程对象到向量 vecOfThreads.push_back(std::thread(func)); // 将所有三个线程对象移动到向量 std::thread th1(func); std::thread th2(func); std::thread th3(func); // 将所有三个线程对象移动到向量 vecOfThreads.push_back(std::move(th1)); vecOfThreads.push_back(std::move(th2)); vecOfThreads.push_back(std::move(th3)); // 在主线程中做一些重要的工作。 /** 等待vector中的所有线程加入**/ // 遍历线程向量 for (std::thread& th : vecOfThreads) { // 如果线程对象是可加入的,则加入该线程。 if (th.joinable()) th.join(); } return 0; }