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.
}

那么,我的问题是:

你的伪代码可以工作,但在 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 总是更好。我不认为拥有多个线程是个好主意,因为您要写入的文件将成为一个争论点。