首页 > 编程知识 正文

c++线程池创建的四种,实现线程的两种方式

时间:2023-05-04 17:05:34 阅读:159622 作者:3979

1 .通过函数thread :标准库的类

join :阻止主线程并等待

//multithread.CPP : definestheentrypointfortheconsoleapplication.# include ' STD afx.h ' # include iostream # include vore cout '线程执行已完成' endl; (}int main ) ) STD:3360threadmy2obj ) myprint; //可调用对象my2Obj.join (; //主线程在此处被阻止,等待myPrint ()完成cout 'wangtao' endl的运行; 返回0; () ) ) ) )。

detach(): 将主线程和子线程完全分离,子线程会驻留在后台运行,被C++运行时库接管,失去控制

voidmyprint(cout )线程为1 )1' endl; cout '线程开始执行2' endl; cout '线程开始执行3' endl; cout '线程开始执行4' endl; cout '线程开始执行5' endl; cout '线程开始执行6' endl; cout '线程开始执行7' endl; cout '线程开始执行8' endl; cout '线程开始执行9' endl; (}int main ) ) STD:3360threadmy2obj ) myprint; //主线程在此处被阻止,并等待myPrint ()完成运行(my2Obj.detach )。 cout 'wangtao1' endl; cout 'wangtao2' endl; cout 'wangtao3' endl; cout 'wangtao4' endl; cout 'wangtao5' endl; cout 'wangtao6' endl; cout 'wangtao7' endl; cout 'wangtao8' endl; 返回0; () ) ) ) )。

joinable():判断是否可以成功使用join()或者detach()

程序说明:detach后不能在实施join

int main () STD:3360threadmy2obj ) myprint; //主线程在此处被阻止,并等待myPrint ()执行(if ) my2obj.joinable )。 ({cout '1:joinable ) )==true' endl; } else { cout ' 1: join able (==false ' endl; (}my2Obj.detach ); if(my2obj.joinable () ({cout '2:joinable ) )==true' endl; } else { cout ' 2: join able (==false ' endl; }cout 'wangtao1' endl; cout 'wangtao2' endl; cout 'wangtao3' endl; cout 'wangtao4' endl; cout 'wangtao5' endl; cout 'wangtao6' endl; cout 'wangtao7' endl; cout 'wangtao8' endl; 返回0; () ) ) ) )。

int main () STD:3360threadmy2obj ) myprint; //主线程在此处被阻止,myPrint ()为if ) ({my2Obj.joinable ) ) my2obj.join ); }cout 'wangtao1' endl; cout 'wangtao2' endl; cout 'wangtao3' endl; cout 'wangtao4' endl; cout 'wangtao5' endl; cout 'wangtao6' endl; cout 'wangtao7' endl; cout 'wangtao8' endl; 返回0; () ) ) ) )。

2 .从类对象创建线程class cobject ({ public : void operator () ) )线程并执行' endl '。 cout '线程结束' endl; }; int main () {CObject obj; STD:threadmy2obj(obj ); //主线程在此处被阻止,myPrint ()为if ) ({my2Obj.joinable ) ) my2obj.join ); }cout 'see you ' endl; 返回0; () ) ) ) )。

class CObject{int m_obj; public:cobject(intI ) :m_obj(I ) ({}void operator ) ) ) /无参数cout '线程为1' endl; cout '线程开始执行2' endl; cout '线程开始执行3' endl; cout '线程开始执行4' endl; cout '线程开始执行5' endl; }; int main () {int i=6; cobjectobj(I; STD:threadmy2obj(obj ); //此时主线程将被阻塞,并等待myPrint ()执行if(my2obj.joinable ) ) ({my2Obj.detach )。 }cout 'see you ' endl; 返回0; () ) ) ) )。

detach ) )在主线程上终止对象将会丢弃,但是否可以调用子线程的成员函数?

此处的对象被复制到子线程中,并且在主线程退出时不会丢弃复制的子线程对象

引用,没有指针就没有问题

复制构造函数和析构函数,以确保对象已复制到子线程

//multithread.CPP : definestheentrypointfortheconsoleapplication.//# include ' STD afx.h ' # include iostream # incleam 公共: cobject (inti ) :m_obj(i ) I ) {cout 'ctor' endl; }cobject(constcobjectm ) :m_obj ) m.m_obj ) {cout 'copy ctor' endl; }~CObject () {cout 'dtor' endl; }void operator () ) )cout '线程在没有参数的情况下返回1' endl; cout '线程开始执行2' endl; cout '线程开始执行3' endl; cout '线程开始执行4' endl; cout '线程开始执行5' endl; }; int main () {int i=6; cobjectobj(I; STD:threadmy2obj(obj ); //此时主线程将被阻塞,并等待myPrint ()执行if(my2obj.joinable ) ) ({my2Obj.detach )。 }cout 'see you ' endl; 返回0; }

由于子线程的析构函数在后台运行,因此输出的dtor是主线程。 join ) )的结果如下。

使用lambda表达式创建线程int main () automylamthread=[] ) cout )线程,然后单击' endl; cout '线程结束' endl; (; threadcthread(mylamthread; cthread.join (; std:cout 'see you ' endl; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。