和Lite2D项目中的网络线程和主线程 交互方式 差不多
在这里,队列是线程安全的,
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <vector>
#include <thread>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include "windows.h"
#include <functional>
#include "direct.h"
#include <map>
#include <memory>
#include <queue>
#include <condition_variable>
#include <mutex>
using namespace std;
#define LOCK(WHAT) std::unique_lock<std::mutex> locker(WHAT);
template<class T>
class QueueThreadSafe
{
public:
void push(T &t)
{
LOCK(this->_mutex);
this->_queue.push(t);
}
T front()
{
LOCK(this->_mutex);
T & ret = this->_queue.front();
this->_queue.pop();
return ret;
}
bool empty()
{
LOCK(this->_mutex);
bool ret = this->_queue.empty();
return ret;
}
private:
std::queue<T> _queue;
std::mutex _mutex;
};
class UDPClient
{
public:
void send(char *buffer)
{
LOCK(this->_mutex);
reqs.push(buffer);
this->_cond.notify_all();
}
void loop()
{
while (this->isRun)
{
LOCK(this->_mutex);
if (this->reqs.empty() == true)
{//如果队列为空,那么等待唤醒
this->_cond.wait(this->_mutex);
}
cout << "send :" << reqs.front() << endl;
}
}
bool isRun = true;
std::mutex _mutex;
QueueThreadSafe<char*> reqs;
std::condition_variable_any _cond;
};
static UDPClient* instance;
static void workThreadFunc()
{
instance = new UDPClient;
instance->loop();
}
int main()
{
std::thread t(workThreadFunc);
t.detach();
char str[100];
int index = 0;
while (true)
{
// Sleep(1);
sprintf(str, "%d", index++);
instance->send(str);
}
system("pause");
return 0;
}