C++多线程编程第二讲:线程启动、结束,创建线程多法,join,detach

/*线程启动、结束,创建线程多法,join,detach*/
//(1)线程运行的开始和结束
//主线程从main为入口。那我们自己创建的线程也需要从一个函数为入口。
// 当没有detach的时候,整个程序执行结束的标志是主线程执行结束。
  //(1.1)thread
#include<iostream>
#include<thread> //多线成引用的头文件

using namespace std;

void my_print()
{
cout << "my thread is running..." << endl;
//...
cout << "my thread is end!" << endl;
}

int main()
{
thread my_thread(my_print); //创建线程,并执行
my_thread.join(); //主线程需要在这里等待子线程在这里执行结束

cout << "main thread is end!" << endl;
return 0;
}

  //(1.2)join() :等待子线程运行完毕
  //(1.3)detach() :不等待子线程执行结束,子线程交给C++运行时库,在后台运行。执行detach之后,与主线程关联的thread
  // 对象,就会失去关联。

  //(1.4)joinable()  判断是否可以成功使用join或者detach的。

#include<iostream>
#include<thread> //多线成引用的头文件

using namespace std;

void my_print()
{
cout << "my thread is running..." << endl;
//...
cout << "my thread is end!" << endl;
}

int main()
{
thread my_thread(my_print);
if (my_thread.joinable())
{
my_thread.join();
}

cout << "main thread is end!" << endl;
return 0;
}

//(2)其他创建线程的方法

  //(2.1)用法、以及一个问题范例

#include<iostream>
#include<thread> //多线成引用的头文件

using namespace std;

class TA
{
public:
void operator()() //让类成为一个可调用对象
{
cout << "TA的operator方法开始执行..." << endl;
}
};

int main()
{
TA ta;
thread mytobj3(ta);
if (mytobj3.joinable())
{
mytobj3.join();
}

cout << "main thread is end!" << endl;
return 0;
}

  // 注意的一个问题:

#include<iostream>
#include<thread> //多线成引用的头文件

using namespace std;

class TA
{
public:
int& m_i;    //这个地方使用引用会出现问题
TA(int& i) :m_i(i) {}
void operator()() //让类成为一个可调用对象
{
cout << "m_i = " << m_i << endl;
}
};

int main()
{
int myi = 6;         //当主线程中的这个值的内存被释放之后,创建的线程的中的引用也会发生异常
TA ta(myi);         
thread mytobj3(ta);   //ta调用了拷贝构造函数。
mytobj3.detach();

cout << "main thread is end!" << endl;
return 0;
}

 


#include<iostream>
#include<thread> //多线成引用的头文件

using namespace std;

class TA
{
public:
int& m_i; //这个引用会引起未知的错误
TA(int& i) :m_i(i)
{
cout << "TA的构造函数执行..." << endl;
}

TA(const TA& ta) :m_i(ta.m_i)
{
cout << "TA 的拷贝构造函数执行..." << endl;
}

~TA()
{
cout << "TA 的析构函数执行..." << endl;
}

void operator()() //让类成为一个可调用对象
{
cout << "m_i = " << m_i << endl;
}
};

int main()
{
int myi = 6;
TA ta(myi); 
thread mytobj3(ta);
mytobj3.detach();

cout << "main thread is end!" << endl;
return 0;
}

//(2.2)用lambda表达式

#include<iostream>
#include<thread> //多线程引用的头文件

using namespace std;

int main()
{
auto mylamthread = [] {
cout << "mylamthread thread start..." << endl;
};

thread mythread(mylamthread);
if (mythread.joinable())
{
mythread.join();
}

cout << "main thread is end!" << endl;
return 0;
}

 

 

  

  

posted on 2021-09-23 22:36  xcxfury001  阅读(169)  评论(0)    收藏  举报

导航