C++11——多執行緒程式設計11 執行緒函式:類的靜態函式和成員函式
阿新 • • 發佈:2021-11-09
翻譯來自: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