繁体   English   中英

多线程文件流

[英]Multithreaded filestream

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

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解决相同的问题吗?

标准流没有线程安全保证。 安全地完成您要执行的操作的唯一方法是序列化对流的访问。

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

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

一种更正确的方法(特别是对于记录器而言)是使记录线程带有消息队列。 当另一个线程要记录时,它只是将一条消息发布到队列中,而记录线程将遍历该队列并将所有内容写入磁盘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM