【引例】
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void myprint(const int& i, char* pmybuf ) {
cout << i << endl;
cout << pmybuf << endl;
return;
}
int main()
{
int val = 1;
int& val_y = val;
char buf[] = "This is a Test!";
thread mythread(myprint, val, buf); //传递参数
mythread.join();
//主线程执行
std::cout << "主线程收尾" << std::endl;
return 0;
}
void myprint(const int i, const string & pmybuf ) {cout << i << endl;cout << pmybuf.c_str() << endl;return;}
thread mythread(myprint, val, buf); //传递参数
thread mythread(myprint, val, string(buf) ); //传递参数
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了" << endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << endl; }
~A() { cout << "A:: ~A()函数执行了" << endl; }
};
void myprint(const int i, const A & p_a ) {
cout << &p_a << endl; //这里打印p_a对象的地址
return;
}
int main()
{
int m_val = 1;
int n_val = 22;
thread mythread(myprint, m_val, n_val); //希望n_val转换成A类对象传给myprint第二个参数
mythread.join();
//主线程执行
std::cout << "主线程收尾" << std::endl;
return 0;
}
thread mythread(myprint, m_val, A(n_val));
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了" << this << " ThreadId " \
<< std::this_thread::get_id()<< endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << this \
<< " ThreadId " << std::this_thread::get_id() << endl; }
~A() { cout << "A:: ~A()函数执行了" << this << " ThreadId " \
<< std::this_thread::get_id() << endl; }
};
void myprint(const A &p_a ) {
cout << "子线程myprint()参数地址:" << &p_a << " ThreadId " \
<< std::this_thread::get_id() << endl;
return;
}
int main()
{
cout << "主线程ID" << std::this_thread::get_id() << endl;
int n_val = 69;
thread mythread(myprint, n_val); //希望n_val转换成A类对象传给myprint第二个参数
mythread.join();
//主线程执行
std::cout << "主线程收尾" << std::endl;
return 0;
}
thread mythread(myprint, A(n_val));
void myprint(const A p_a )
在线程中修改变量的值不会影响到主线程。
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
mutable int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了" << this << " ThreadId " \
<< std::this_thread::get_id()<< endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << this \
<< " ThreadId " << std::this_thread::get_id() << endl; }
~A() { cout << "A:: ~A()函数执行了" << this << " ThreadId " \
<< std::this_thread::get_id() << endl; }
};
void myprint(const A &p_a ) {
p_a.m_i = 89;
cout << "子线程myprint()参数地址:" << &p_a << " ThreadId " \
<< std::this_thread::get_id() << endl;
return;
}
int main()
{
cout << "主线程ID" << std::this_thread::get_id() << endl;
A a(1);
thread mythread(myprint, a);
mythread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【std::ref()】
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了"<< endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << endl; }
~A() { cout << "A:: ~A()函数执行了" << endl; }
};
void myprint(A &p_a ) {
p_a.m_i = 89;
cout << "子线程myprint()执行了" << endl;
return;
}
int main()
{
A a(1);
thread mythread(myprint, std::ref(a));
mythread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
智能指针,想从一个堆栈到另一个堆栈,需要使用std::move()
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void myprint(unique_ptr<int> ptr_u) {
cout << "子线程myprint()执行了" << endl;
return;
}
int main()
{
unique_ptr<int> m_ptr(new int(100));
thread mythread(myprint, std::move(m_ptr));
mythread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了"<< endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << endl; }
void func(int i) { cout << "A::func(int i)函数执行了" \
<< " i = " << i << endl; }
~A() { cout << "A:: ~A()函数执行了" << endl; }
};
int main()
{
A a_obj(11);
thread mythread(&A::func, a_obj, 233);
mythread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【注】类对象使用引用方式传递
thread mythread(&A::func, &a_obj, 233);
thread mythread(&A::func, std::ref(a_obj), 233);
【operator()带参数】
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class A {
public:
int m_i;
//类型转换构造函数,可以把一个int转换为类A对象
A(int i) :m_i(i) { cout << "A::A(int i)函数执行了"<< endl; }
A(const A &other) :m_i(other.m_i) { cout << "A::A(const A &other)函数执行了" << endl; }
void operator()(int i) { cout << "A::operator()执行了" \
<< " i = " << i << endl; }
~A() { cout << "A:: ~A()函数执行了" << endl; }
};
int main()
{
A a_obj(11);
thread mythread(a_obj, 666);
mythread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
thread mythread(std::ref(a_obj), 999);
thread mythread(&a_obj, 999);