admin 管理员组文章数量: 1184232
2024年1月18日发(作者:二维数组怎么写c语言)
thread调用类的函数
线程(thread)是程序执行流的最小单位,是程序执行时的一个相对独立的、可调度的防止单元,线程池是一种多线程编程的实现方式。在多个线程执行的场景下,线程池能够降低线程启动销毁的频率,从而提高程序的运行效率。
在类的函数中,我们通常都需要用到线程,以及线程池。因此,本文将围绕如何在线程和线程池中调用类的函数进行讨论。
1.创建线程
在创建线程之前先要引入头文件并创建一个类。然后再通过类的成员函数,将该函数传递给线程。
```c++
#include
#include
using namespace std;
class Demo
{
public:
static void Run()
{
cout<<"Thread Running"< } }; int main() { thread t(Demo::Run); (); return 0; } ``` 上述示例中,首先创建了一个名为Demo的类,类中包含一个静态函数Run。在主函数中,我们创建了一个线程t,并将Demo::Run函数传递给线程t。最后,我们使用函数等待线程t运行结束。 2.使用线程池 在使用线程池之前,需要先引入头文件,然后创建线程池对象,并设置线程的最大数量。对于线程池类中的成员函数,我们需要利用 bind 函数来将类的成员函数和类的实例对象进行绑定。 ```c++ #include #include #include #include #include #include using namespace std; class ThreadPool { public: ThreadPool(int n) { for(int i=0;i { _back(thread(&ThreadPool::Task, this)); } } ~ThreadPool() { stop=true; _all(); for(thread &t:threads) { if(le()) { (); } } } void AddTask(function { unique_lock (task); _one(); } protected: void Task() { while(true) { unique_lock if(stop&&()) { return; } if(!()) { auto task=(); (); (); task(); } else { (lock); } } } private: vector queue mutex m; condition_variable cond; bool stop=false; }; class Demo { public: void Run() { cout<<"Thread Running"< } }; int main() { Demo demo; ThreadPool pool(4); k(bind(&Demo::Run,&demo)); return 0; } ``` 在上述示例中,我们首先创建了一个ThreadPool类,在该类的构造函数中创建线程,并设置线程的最大数量,然后通过成员函数 AddTask函数将任务添加到线程池中。 接下来,我们创建了一个Demo类,该类包含一个成员函数Run。在主函数中,我们首先创建了Demo类的实例对象demo,并将其传递给AddTask函数,然后通过bind函数将Demo类中的Run函数和实例对象绑定。 在执行线程池的过程中,我们首先利用unique_lock将互斥锁加锁,并在stop变量为true且tasks队列为空的条件下退出线程;如果tasks队列不为空,则从队列中取出一个任务并执行。 以上便是关于如何在线程和线程池中调用类的函数的讨论。通过本文的讨论,我们深入了解了线程和线程池的实现原理,更加熟练地掌握了多线程编程的实现技巧。
版权声明:本文标题:thread调用类的函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1705564902a490174.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论