添加了消息处理线程
This commit is contained in:
60
LFtid1056/dealMsg.h
Normal file
60
LFtid1056/dealMsg.h
Normal file
@@ -0,0 +1,60 @@
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
#include <atomic>
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define MESSAGE_QUEUE_SIZE 10000 // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
/* <20><>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9> */
|
||||
typedef struct {
|
||||
int client_index; // <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
char* data; // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
size_t length; // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
} deal_message_t;
|
||||
|
||||
/* <20>̰߳<DFB3>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> */
|
||||
class SafeMessageQueue {
|
||||
private:
|
||||
std::queue<deal_message_t> queue;
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
||||
std::atomic<int> count{ 0 };
|
||||
|
||||
public:
|
||||
bool push(const deal_message_t& msg) {
|
||||
pthread_mutex_lock(&mutex);
|
||||
if (queue.size() >= MESSAGE_QUEUE_SIZE) {
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return false;
|
||||
}
|
||||
queue.push(msg);
|
||||
count++;
|
||||
pthread_cond_signal(&cond);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pop(deal_message_t& msg) {
|
||||
pthread_mutex_lock(&mutex);
|
||||
while (queue.empty()) {
|
||||
pthread_cond_wait(&cond, &mutex);
|
||||
}
|
||||
msg = queue.front();
|
||||
queue.pop();
|
||||
count--;
|
||||
pthread_mutex_unlock(&mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return count.load();
|
||||
}
|
||||
};
|
||||
|
||||
void process_received_message(int client_index, const char* data, size_t length);
|
||||
Reference in New Issue
Block a user