1. 程式人生 > 其它 >C++11——多執行緒程式設計11 執行緒函式:類的靜態函式和成員函式

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