我正在创建一个连接到服务器的客户端应用程序,除了其他功能外,还将服务器聊天记录到一个文件中,以便以后可能会惩罚违反规则的行为。
不幸的是,应用程序中必须(至少)有两个线程:接收器循环和发送器循环 - 服务器需要时间精度。这意味着,我需要线程安全的解决方案来将数据记录到文件中。
如果线程(尽可能)同时发送日志信息,则可能会发生这种情况:
logfile.txt:
chat: Hello my name is Duke
chat: Hell[WARNING]: Hacker detectedo my name is John
你可以看到一个句子被注入到另一个句子中。我不希望这种情况发生。我的输出也发生了同样的情况std::cout
,但这并不是那么重要。
问题:
- 如何使
std::ofstream
一次只记录一个数据?(记住其他并在之后插入,而不是在中间) - 如何检查文件是否被其他线程关闭。(或错误)
奖励问题:你能解决同样的问题std::cout
吗?