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) 收藏 举报
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号