gpt4 book ai didi

C++ stdin 偶尔会出现乱码

转载 作者:行者123 更新时间:2023-11-30 05:39:50 27 4
gpt4 key购买 nike

在过去的几天里,我遇到了一个偶尔会发生的奇怪错误。

我有一个控制台应用程序,它还显示一个使用 SDL 打开的窗口,用于连续运行三个线程的图形输出。主线程运行事件循环,并处理控制台输入。第二个线程使用 std::cin.getline 获取控制台输入。然而,第二个线程也负责输出日志信息,当用户点击 SDL 窗口的某处时,就会产生日志信息。

这些日志消息被发送到受互斥锁保护的 stringstream,由线程 2 定期检查。如果有日志消息,它会删除提示,输出它们,然后打印新提示。由于这个原因,它不能在 getline 上阻塞,因此该线程生成第三个线程,该线程 peekcin 并通过 发出信号code>atomic 当有数据要从输入流中获取时,此时调用 getline 并将输入传递给主线程上的逻辑。

这是我还没有完全解决的一点,其中大约有三分之一失败,因为程序没有收到与输入到终端中的输入完全相同的输入。你可以在图片中看到我的意思 here ,第一行是类型,第二行是由于接收到不同(不正确)的输入而导致的 Lua 堆栈跟踪。

无论我是否使用 rlwrap 都会发生这种情况。这是因为 peekgetline 同时访问了输入流吗? (这是可能的,因为 peek 循环看起来像:

while(!exitRequested_)
{
if (std::cin.peek())
inputAvailable_ = true; // this is atomic

std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

有什么想法吗?看了一下curses,不过看起来用起来还是挺费力气的。我以前从未听说过 get line 乱码。但我也打印了一段时间内收到的每个字符串,它们与 Lua 报告的内容相匹配。

最佳答案

正如@davmac 所建议的,peek 似乎一直在干扰 getline。我的假设是,这与 peek 获取一个字符然后在 getline 获取缓冲区的同时将其放回去有关。

无论问题的根本原因是什么,我 >98% 确定问题已通过实现 davmac 建议的修复得到解决。在几个小时的使用中,我没有遇到任何问题。

道德,不要同时访问 cin,即使其中一个函数不修改流。

(请注意,以上内容发生在 g++ 和 clang++ 上,所以我假设它只是与 std 库的频繁实现方式有关)。

正如@DavidSchwartz 所指出的,并发访问流是被明确禁止的,因此这清楚地解释了修复工作的原因。

关于C++ stdin 偶尔会出现乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073057/

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