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;
}

 

 

 

 
posted @ 2021-11-22 18:30  冰糖葫芦很乖  阅读(467)  评论(0编辑  收藏  举报