//传递类参数,智能指针作为线程参数
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;
class A
{
public:
//类型转换构造函数
A()
{
cout << "构造函数执行"<< this << "threadid =" << std::this_thread::get_id() << endl;
}
A(const A & a)
{
cout << "拷贝构造函数执行" << this << "threadid =" << std::this_thread::get_id() << endl;
}
~A()
{
cout << "析构函数执行" << this << "threadid =" << std::this_thread::get_id() << endl;
}
public:
//输入
bool inMsgLUTProc(int & command)
{
for (int i = 0; i < 100000; ++i)
{
//自动锁
std::lock_guard<std::mutex> sbguard(my_mutex);
msgRecQueue.push_back(i);
cout << "inMsgLUTProc insert " << i << endl;
}
return true;
}
//把数据从消息队列中取出的线程
bool outMsgLUTProc(int & command)
{
for (int i = 0; i < 100000; ++i)
{
//自动锁
std::lock_guard<std::mutex> sbguard(my_mutex);
if (!msgRecQueue.empty())
{
//不为空
int command = msgRecQueue.front();
msgRecQueue.pop_front();
cout << "outMsgLUTProc delete " << command << endl;
}
else
{
}
}
return false;
}
private:
std::list<int> msgRecQueue;
std::mutex my_mutex;
};
#include <memory>
void myprint(const unique_ptr<int>& mybuf)
{
cout << "myprint" << *mybuf << endl;
}
int main()
{
//智能指针的使用
unique_ptr<int> myp(new int(100));
std::thread mytest(myprint, std::move(myp));
A myobj;
//第三个为参数command
//bool outMsgLUTProc(int & command)
std::thread myOutMsgObj(&A::outMsgLUTProc, std::ref(myobj),11);//std::ref() 重点,引用本身,不加会copy construct,
std::thread myInMsgObj(&A::inMsgLUTProc, std::ref(myobj),11);
myInMsgObj.join();
myOutMsgObj.join();
cout << "I love china !" << endl;
return 0;
}