#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
class A{
public:
//把收到的消息(玩家命令)加入到一个队列的线程
void inMsgRecvQueue()
{
for (int i = 1; i < 10000; ++i)
{
cout << "inMsgRecvQueue执行了,插入一个元素" << i << endl;
my_mutex.lock();
msgRecvQueue.push_back(i); //假设这个数字就是玩家发来的命令,加入到消息队列中
my_mutex.unlock();
}
}
//在这个函数中加锁
bool outMsgMutPro(int& command )
{
my_mutex.lock();
if (!msgRecvQueue.empty()) {
//消息队列不为空
command = msgRecvQueue.front(); //返回第一个元素,但不检查元素是否存在
msgRecvQueue.pop_front(); //移除第一个元素,但不返回
my_mutex.unlock();
return true;
}
my_mutex.unlock();
return false;
}
//把消息从消息队列中取出的线程
void outMsgRecvQueue()
{
int command{};
for (int i = 1; i < 10000; ++i)
{
bool ret = outMsgMutPro(command);
if (ret)
{
cout << "outMsgMutPro执行了,取出一个元素" << command << endl;
//这里就针对具体的命令具体处理
//...
}
else {
//消息队列为空
cout << "outMsgRecvQueue执行了,但是当前消息队列为空" << i << endl;
}
}
cout << "outMsgRecvQueue()执行完毕" << endl;
}
private:
std::list<int> msgRecvQueue; //容器(消息队列),专门代表玩家给我们发来的命令
std::mutex my_mutex;
};
int main()
{
A obja;
std::thread outMsgThread(&A::outMsgRecvQueue, &obja); //第二个参数是引用,保证线程里操作同一个对象
std::thread inMsgThread(&A::inMsgRecvQueue, &obja);
inMsgThread.join();
outMsgThread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
class A{
public:
//把收到的消息(玩家命令)加入到一个队列的线程
void inMsgRecvQueue()
{
for (int i = 1; i < 10000; ++i)
{
cout << "inMsgRecvQueue执行了,插入一个元素" << i << endl;
{
std::lock_guard<mutex> mutex_guard_in(my_mutex);
msgRecvQueue.push_back(i); //假设这个数字就是玩家发来的命令,加入到消息队列中
}
//其他代码...
}
}
//在这个函数中加锁
bool outMsgMutPro(int& command )
{
std::lock_guard<mutex> mutex_guard_out(my_mutex);
if (!msgRecvQueue.empty())
{
//消息队列不为空
command = msgRecvQueue.front(); //返回第一个元素,但不检查元素是否存在
msgRecvQueue.pop_front(); //移除第一个元素,但不返回
return true;
}
return false;
}
//把消息从消息队列中取出的线程
void outMsgRecvQueue()
{
int command{};
for (int i = 1; i < 10000; ++i)
{
bool ret = outMsgMutPro(command);
if (ret)
{
cout << "outMsgMutPro执行了,取出一个元素" << command << endl;
//这里就针对具体的命令具体处理
//...
}
else {
//消息队列为空
cout << "outMsgRecvQueue执行了,但是当前消息队列为空" << i << endl;
}
}
cout << "outMsgRecvQueue()执行完毕" << endl;
}
private:
std::list<int> msgRecvQueue; //容器(消息队列),专门代表玩家给我们发来的命令
std::mutex my_mutex;
};
int main()
{
A obja;
std::thread outMsgThread(&A::outMsgRecvQueue, &obja); //第二个参数是引用,保证线程里操作同一个对象
std::thread inMsgThread(&A::inMsgRecvQueue, &obja);
inMsgThread.join();
outMsgThread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;
class A
{
public:
//把收到的消息(玩家命令)加入到一个队列的线程
void inMsgRecvQueue()
{
for (int i = 1; i < 10000; ++i)
{
cout << "inMsgRecvQueue执行了,插入一个元素" << i << endl;
my_mutex2.lock();
//其他代码
my_mutex1.lock();
msgRecvQueue.push_back(i); //假设这个数字就是玩家发来的命令,加入到消息队列中
my_mutex1.unlock();
//其他代码
my_mutex2.unlock();
}
}
//在这个函数中加锁
bool outMsgMutPro(int& command )
{
my_mutex1.lock();
//其他代码
my_mutex2.lock();
if (!msgRecvQueue.empty())
{
//消息队列不为空
command = msgRecvQueue.front(); //返回第一个元素,但不检查元素是否存在
msgRecvQueue.pop_front(); //移除第一个元素,但不返回
my_mutex2.unlock();
//其他代码
my_mutex1.unlock();
return true;
}
my_mutex2.unlock();
//其他代码
my_mutex1.unlock();
return false;
}
//把消息从消息队列中取出的线程
void outMsgRecvQueue()
{
int command{};
for (int i = 1; i < 10000; ++i)
{
bool ret = outMsgMutPro(command);
if (ret)
{
cout << "outMsgMutPro执行了,取出一个元素" << command << endl;
//这里就针对具体的命令具体处理
//...
}
else {
//消息队列为空
cout << "outMsgRecvQueue执行了,但是当前消息队列为空" << i << endl;
}
}
cout << "outMsgRecvQueue()执行完毕" << endl;
}
private:
std::list<int> msgRecvQueue; //容器(消息队列),专门代表玩家给我们发来的命令
std::mutex my_mutex1;
std::mutex my_mutex2;
};
int main()
{
A obja;
std::thread outMsgThread(&A::outMsgRecvQueue, &obja); //第二个参数是引用,保证线程里操作同一个对象
std::thread inMsgThread(&A::inMsgRecvQueue, &obja);
inMsgThread.join();
outMsgThread.join();
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
class A
{
public:
//把收到的消息(玩家命令)加入到一个队列的线程
void inMsgRecvQueue()
{
for (int i = 1; i < 10000; ++i)
{
cout << "inMsgRecvQueue执行了,插入一个元素" << i << endl;
std::lock(my_mutex1, my_mutex2);
msgRecvQueue.push_back(i); //假设这个数字就是玩家发来的命令,加入到消息队列中
my_mutex1.unlock();
//其他代码
my_mutex2.unlock();
}
}
//在这个函数中加锁
bool outMsgMutPro(int& command )
{
std::lock(my_mutex1, my_mutex2);
if (!msgRecvQueue.empty())
{
//消息队列不为空
command = msgRecvQueue.front(); //返回第一个元素,但不检查元素是否存在
msgRecvQueue.pop_front(); //移除第一个元素,但不返回
my_mutex2.unlock();
//其他代码
my_mutex1.unlock();
return true;
}
my_mutex2.unlock();
//其他代码
my_mutex1.unlock();
return false;
}
//把消息从消息队列中取出的线程
void outMsgRecvQueue()
{
int command{};
for (int i = 1; i < 10000; ++i)
{
bool ret = outMsgMutPro(command);
if (ret)
{
cout << "outMsgMutPro执行了,取出一个元素" << command << endl;
//这里就针对具体的命令具体处理
//...
}
else {
//消息队列为空
cout << "outMsgRecvQueue执行了,但是当前消息队列为空" << i << endl;
}
}
cout << "outMsgRecvQueue()执行完毕" << endl;
}
private:
std::list<int> msgRecvQueue; //容器(消息队列),专门代表玩家给我们发来的命令
std::mutex my_mutex1;
std::mutex my_mutex2;
};
class A
{
public:
//把收到的消息(玩家命令)加入到一个队列的线程
void inMsgRecvQueue()
{
for (int i = 1; i < 10000; ++i)
{
cout << "inMsgRecvQueue执行了,插入一个元素" << i << endl;
std::lock(my_mutex1, my_mutex2);
std::lock_guard<mutex> in_mutex_guard1(my_mutex1, std::adopt_lock);
std::lock_guard<mutex> in_mutex_guard2(my_mutex2, std::adopt_lock);
msgRecvQueue.push_back(i); //假设这个数字就是玩家发来的命令,加入到消息队列中
//其他代码
}
}
//在这个函数中加锁
bool outMsgMutPro(int& command )
{
std::lock(my_mutex1, my_mutex2);
std::lock_guard<mutex> out_mutex_guard1(my_mutex1, std::adopt_lock);
std::lock_guard<mutex> out_mutex_guard2(my_mutex2, std::adopt_lock);
if (!msgRecvQueue.empty())
{
//消息队列不为空
command = msgRecvQueue.front(); //返回第一个元素,但不检查元素是否存在
msgRecvQueue.pop_front(); //移除第一个元素,但不返回
return true;
}
return false;
}
//把消息从消息队列中取出的线程
void outMsgRecvQueue()
{
int command{};
for (int i = 1; i < 10000; ++i)
{
bool ret = outMsgMutPro(command);
if (ret)
{
cout << "outMsgMutPro执行了,取出一个元素" << command << endl;
//这里就针对具体的命令具体处理
//...
}
else {
//消息队列为空
cout << "outMsgRecvQueue执行了,但是当前消息队列为空" << i << endl;
}
}
cout << "outMsgRecvQueue()执行完毕" << endl;
}
private:
std::list<int> msgRecvQueue; //容器(消息队列),专门代表玩家给我们发来的命令
std::mutex my_mutex1;
std::mutex my_mutex2;
};