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
posted @ 2021-11-09 11:56  冰糖葫芦很乖  阅读(4374)  评论(1编辑  收藏  举报