gpt4 book ai didi

c++ - 多线程文件流

转载 作者:行者123 更新时间:2023-11-27 23:17:13 25 4
gpt4 key购买 nike

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

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

您可以看到一个句子被注入(inject)到另一个句子中。我不希望这一切发生。我的 std::cout 输出也发生了同样的情况,但这并不重要。

问题:

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

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

最佳答案

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

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

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

一个更正确的方法,尤其是对于一个记录器来说,是有一个带有消息队列的记录线程。当另一个线程想要记录日志时,它只是将消息发送到队列,日志线程将遍历队列并将所有内容写入磁盘。

关于c++ - 多线程文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com