#include <iostream>
#include <thread>
#include <string>
using namespace std;
//自己创建一个线程,也需要从一个函数开始运行;
//void my_print(const int i, char *p_myBuf)
void my_print(const int i, const string &p_myBuf)
{
cout<<"i:"<<i<<endl;
//分析认为,i并不是m1的引用,实际是值传递,那么即使主线程结束,也不是影响子线程的这个变量的使用
cout<<"p_myBuf:"<<p_myBuf<<endl;
//指针在deatch子线程时,绝对会有问题,所以这边一定不能传指针
return;
}
int main()
{
/*
一:传递零时对象作为线程参数
(2.1)只要用临时构造的A类对象作为参数传递给线程,那么就一定能够在主线程执行完毕前把线程函数的参数构造出来
若传递int这样的简单类型参数,建议都是值传递,不要使用引用,仿真主线程结束变量被释放造成问题。
如果传递类对象,避免隐式转换。全部都在创建线程这一行就构建出临时对象来,然后在函数参数里使用引用来接。
如果不使用引用,那么会多调用一次拷贝构造函数。
(2.2)
二:临时对象作为线程参数
线程id的概念: id是一个数字,每个线程(不管是主线程还是子线程)实际上都对应着一个数字。
不同线程的id必然是不一样的。
线程id可以用c++标准库中的函数来获取std:this_thread::get_id();
*/
int m1=1;
int &m2 = m1;
char mybuf[] = "this is a test!";
//实际上mybuf被回收了(main执行完了)系统才用mybuf转成string,这样会出问题
//std::thread my_thread4(my_print, m1, mybuf);
将mybuf转换成一个零时对象,这样就能保证不出问题。
std::thread my_thread4(my_print, m1, string(mybuf));
//my_thread4.join();
my_thread4.detach();//子线程和主线程分别执行
cout << "Hello world!" << endl;
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <thread>
#include <string>
using namespace std;
class A
{
public:
int m_i;
A(int i):m_i(i)
{
cout << "构造函数执行了"<<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
}
A(const A &a1):m_i(a1.m_i)
{
cout << "拷贝构造函数执行" <<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
}
~A()
{
cout << "析构函数执行" <<this<<" thread ID:"<<std::this_thread::get_id()<< endl;
}
void operator()()//不能带参数
{
cout << "我的线程 operator执行了" << endl;
cout << "m_i的值为:"<<m_i<< endl;
}
};
void myprint2(const A &pmybuf)
{
cout<<"子线程 myprint2参数地址"<<&pmybuf
<<"threadid:"<<std::this_thread::get_id()<<endl;
}
int main()
{
/*
(2.2)
二:临时对象作为线程参数
线程id的概念: id是一个数字,每个线程(不管是主线程还是子线程)实际上都对应着一个数字。
不同线程的id必然是不一样的。
线程id可以用c++标准库中的函数来获取std::this_thread::get_id();
*/
cout<<"主线程ID:"<<this_thread::get_id()<<endl;
int m1=1;
//在主线程中使用临时对象来传递,就会线程安全。
//传递类对象时就使用引用接收主线程中创建线程时的临时对象,这样能确保线程安全和少调用一次拷贝构造函数。
std::thread my_thread5(myprint2,A(m1));
char mybuf[] = "this is a test!";
//my_thread5.join();
my_thread5.detach();//子线程和主线程分别执行
cout << "Hello world!" << endl;
return 0;
}
智能指针作为线程函数的参数
void my_print(unique_ptr<int> pIn)//线程函数
{
cout<<"my_print"<<<<"threadId:"<<std::this_thread::get_id()<<endl;
}
int main()
{
unique_ptr<int> pInt(new int(100));
std::thread myjob_th(my_print,std::move(pInt));
myjob_th.join();
//myjob_th.detach();
return 0;
}