翻譯來自: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