翻译来自: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
原文链接: https://www.cnblogs.com/Galesaur-wcy/p/15528174.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/214796
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!