C++11——多線程編程11 線程函數:類的靜態函數和成員函數


翻譯來自:https://thispointer.com/c11-start-thread-by-member-function-with-arguments/

在這個文章 我們將討論如何通過類的函數啟動線程

以類的成員函數作為自己的線程函數

首先我們有一個Task類,有一個不是非靜態成員函數execute()

class Task
{
public:
    void execute(std::string command);
};

現在我們要啟動一個線程,該線程使用 Task 類的 execute() 函數作為線程函數。

由於execute()是Task類的一個非靜態函數,所以首先我們需要一個對象來調用這個函數。讓我們創建一個 Task 類的對象,即

Task * taskPtr = new Task();

現在讓我們創建一個線程,它將通過它的對象使用這個成員函數 execute() 作為線程函數,即

// 使用成員函數創建線程
std::thread th ( &Task::execute, taskPtr, "Sample Task" ) ;

在 std::thread 構造函數中,我們傳遞了 3 個參數,即

1.) 指向類Task的成員函數執行的指針
當std::thread將在內部創建一個新線程時,它將使用這個傳遞的成員函數作為線程函數。但是要調用成員函數,我們需要一個對象。

2.) 類Task對象的指針
作為第二個參數,我們傳遞了一個指向類Task對象的指針,上面的成員函數將被調用。在每個非靜態成員函數中,第一個參數總是指向它自己類的對象的指針。因此,線程類將在調用傳遞的成員函數時將此指針作為第一個參數傳遞

3.) 字符串值
這將作為第二個參數傳遞給成員函數,即在 Task * 之后

#include <iostream>
#include <thread>
class Task
{
public:
    void execute(std::string command)
    {
        for(int i = 0; i < 5; i++)
        {
            std::cout<<command<<" :: "<<i<<std::endl;
        }
    }
};
int main()
{
    Task * taskPtr = new Task();
    // Create a thread using member function
    std::thread th(&Task::execute, taskPtr, "Sample Task");
    th.join();
    delete taskPtr;
    return 0;
}

輸出:

Sample Task :: 0
Sample Task :: 1
Sample Task :: 2
Sample Task :: 3
Sample Task :: 4

 

以類的靜態函數作為自己的線程函數

因為靜態函數不與類的任何對象相關聯。因此,我們可以直接將類的靜態成員函數作為線程函數傳遞,而無需傳遞任何指向對象的指針即

#include <iostream>
#include <thread>
class Task
{
public:
    static void test(std::string command)
    {
        for(int i = 0; i < 5; i++)
        {
            std::cout<<command<<" :: "<<i<<std::endl;
        }
    }
};
int main()
{
    // Create a thread using static member function
    std::thread th(&Task::test, "Task");
    th.join();
    return 0;
}

 

輸出:

Sample Task :: 0
Sample Task :: 1 Sample Task :: 2 Sample Task :: 3 Sample Task :: 4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM