0

我正在创建一个连接到服务器的客户端应用程序,除了其他功能外,还将服务器聊天记录到一个文件中,以便以后可能会惩罚违反规则的行为。
不幸的是,应用程序中必须(至少)有两个线程:接收器循环和发送器循环 - 服务器需要时间精度。这意味着,我需要线程安全的解决方案来将数据记录到文件中。
如果线程(尽可能)同时发送日志信息,则可能会发生这种情况:

logfile.txt:
chat: Hello my name is Duke
chat: Hell[WARNING]: Hacker detectedo my name is John

你可以看到一个句子被注入到另一个句子中。我不希望这种情况发生。我的输出也发生了同样的情况std::cout,但这并不是那么重要。

问题:

  1. 如何使std::ofstream一次只记录一个数据?(记住其他并在之后插入,而不是在中间)
  2. 如何检查文件是否被其他线程关闭。(或错误)

奖励问题:你能解决同样的问题std::cout吗?

4

1 回答 1

4

标准流没有线程安全保证。安全地完成您正在尝试做的事情的唯一方法是序列化对流的访问。

最简单的解决方案是将涉及流的任何语句包装在互斥体中。

{
    std::lock_guard<std::mutex> locked(gCoutMutex);
    std::cout << "This is a message" << std::endl;
}

更正确的方法,特别是对于记录器,是有一个带有消息队列的记录线程。当另一个线程想要记录时,它只是向队列发布一条消息,记录线程将通过队列并将所有内容写入磁盘。

于 2013-03-26T22:12:31.013 回答