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