C中Logger线程的线程安全队列
Thread-safe queue for Logger thread in C
所以,我有一个 MMO 游戏服务器监听连接(最多 1100,由于游戏设计的硬编码限制)并且需要在不阻塞我的主线程(处理所有虚拟世界逻辑)的情况下记录所有内容,包括但不限于:NPC 给予玩家的东西、monster/player 死亡时、每条聊天消息、玩家升级时、玩家掉落物品时等
我为每个连接从池中获取一个线程,每个线程都可以随时记录到一个文件(实际上可能永远不会发生,但服务器必须做好充分准备以适当地处理它)。
我想到了一个独立的日志记录线程,不断地检查一个订单队列,直到它不为空。
while Game is Running
Check the queue, if it's empty, sleep.
File IO. Open plain-text file, log and gracefully close it.
Repeat.
一个链表是否足以组织队列并用这样的互斥体保护它?
LogThreadOrder Queue[1024];
LogThreadOrder *FirstThreadOrder;
int NumberOfOrders;
struct LogThreadOrder {
char FileName[4096];
char LogMessage[4096];
LogThreadOrder* NextOrder;
};
void Log(const char* FileName, const char* LogMessage) {
LogMutex.lock();
ProtocolThreadOrder* Order = Queue[NumberOfOrders++];
Order->NextOrder = FirstThreadOrder;
FirstThreadOrder = Order;
LogMutex.release();
}
int LogThreadLoop() {
// Loop through Queue until its empty.
}
那么,我的问题是:
这是一个聪明的设计吗?
它是线程安全的吗?
有没有更好的方法来完成我想做的事情?
多logger线程多队列会不会better/more-efficient?
你的伪代码可以工作,但在 C 中很难,互斥锁同步效率低下。根据我的经验,使用现有的、完善的、异步的 inter-process communication mechanisms between threads like named pipes. Even then there are many pitfalls and when dependencies aren't a problem using something like ZeroMQ might be the best idea. Specifically something like this 总是更好。我不认为拥有多个线程是个好主意,因为您要写入的文件将成为一个争论点。
所以,我有一个 MMO 游戏服务器监听连接(最多 1100,由于游戏设计的硬编码限制)并且需要在不阻塞我的主线程(处理所有虚拟世界逻辑)的情况下记录所有内容,包括但不限于:NPC 给予玩家的东西、monster/player 死亡时、每条聊天消息、玩家升级时、玩家掉落物品时等
我为每个连接从池中获取一个线程,每个线程都可以随时记录到一个文件(实际上可能永远不会发生,但服务器必须做好充分准备以适当地处理它)。
我想到了一个独立的日志记录线程,不断地检查一个订单队列,直到它不为空。
while Game is Running
Check the queue, if it's empty, sleep.
File IO. Open plain-text file, log and gracefully close it.
Repeat.
一个链表是否足以组织队列并用这样的互斥体保护它?
LogThreadOrder Queue[1024];
LogThreadOrder *FirstThreadOrder;
int NumberOfOrders;
struct LogThreadOrder {
char FileName[4096];
char LogMessage[4096];
LogThreadOrder* NextOrder;
};
void Log(const char* FileName, const char* LogMessage) {
LogMutex.lock();
ProtocolThreadOrder* Order = Queue[NumberOfOrders++];
Order->NextOrder = FirstThreadOrder;
FirstThreadOrder = Order;
LogMutex.release();
}
int LogThreadLoop() {
// Loop through Queue until its empty.
}
那么,我的问题是:
这是一个聪明的设计吗?
它是线程安全的吗?
有没有更好的方法来完成我想做的事情?
多logger线程多队列会不会better/more-efficient?
你的伪代码可以工作,但在 C 中很难,互斥锁同步效率低下。根据我的经验,使用现有的、完善的、异步的 inter-process communication mechanisms between threads like named pipes. Even then there are many pitfalls and when dependencies aren't a problem using something like ZeroMQ might be the best idea. Specifically something like this 总是更好。我不认为拥有多个线程是个好主意,因为您要写入的文件将成为一个争论点。