gpt4 book ai didi

c - 在 Windows 中,即使没有待处理的输入,如何强制 C 的 fread 返回?

转载 作者:行者123 更新时间:2023-12-01 22:03:11 25 4
gpt4 key购买 nike

在具有两个线程的 Windows 程序中:thread1thread2

thread1 在调用 fread(buffer, 1, 10, stdin) 等待输入时被阻塞,是否可以从 thread2< 做一些事情 强制 fread 返回?

到目前为止,我尝试从 thread2 调用 fclose(stdin),但它似乎不起作用。程序卡在 fclose 调用处,直到 stdin 流中有一些输入可用。

我想要实现的是优雅地终止 thread1 而不是用 TerminateThread 杀死它,因为 thread1 有一些工作必须在最后做。

要考虑的另一件事是 stdin 是命名管道的一端。我无法控制管道另一端的程序。
我需要的只是断开我的程序与其管道末端的连接(在本例中为 stdin)。

最佳答案

调用fclose(stdin) 是一个非常糟糕的主意;如果它发生在 fread 之前(它没有相对于它排序)或者如果调用 fread 的线程做了 任何 ,它会导致未定义的行为stdinfread 返回后,它不会解锁 fread 因为 fclose 在获得锁定之前无法继续stdin,正在进行的 fread 正在排除。

stdio 从根本上说不适合您想在此处执行的操作。您可以通过第二个管道转发来修补它,另一个线程从 stdin 读取并写入您的新管道。然后,您可以通过关闭管道的写入端来中止管道读取端的 fread。额外的线程仍然会被卡住,但如果您无论如何都要终止,那并不重要。或者(这可能更干净)您可以使用文件描述符(或 Windows 文件句柄)而不是 stdio 和 poll(或 Windows 等效项)来确定是否有要读取的输入。您可以结合这些方法将特定于 Windows 的文件句柄逻辑放在额外的线程中(从而能够干净地终止它)并继续在您的程序逻辑线程中使用可移植的 stdio

关于c - 在 Windows 中,即使没有待处理的输入,如何强制 C 的 fread 返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53073573/

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