gpt4 book ai didi

windows - 为什么另一个线程中的阻塞 IO 会阻止 CreateWindowEx() 返回

转载 作者:可可西里 更新时间:2023-11-01 10:20:35 34 4
gpt4 key购买 nike

我有一个非常简单的 Windows 控制台应用程序,它首先创建一个线程来处理 stdin 上的输入。它使用 main() 中的 CreateThread() 创建线程,线程做的第一件事是调用 getchar() 并阻塞,等待。

然后 main() 使用 RegisterClass() 注册一个窗口类,并调用 CreateWindowEx() 创建一个不可见的消息窗口。

但是 CreateWindowEx() 永远不会返回。

如果我删除线程中的 getchar() 并将其替换为 while (1) Sleep(1000);,一切正常。

如果我将 Sleep(1000); 添加到线程函数的开头,CreateWindowEx() 调用会成功,但随后线程中的 I/O 停止工作(getchar() 不返回)。

为什么阻塞的第二个线程会干扰第一个线程?

最佳答案

C 运行时库不正式支持从使用 CreateThread 生成的线程调用。您应该使用 CRT 包装器函数,例如 _beginthreadex,它可以在新线程上正确配置 CRT 线程本地状态。

在实践中,即使您违反了该规则,CRT 也会竭尽全力使事情正常进行,但细节取决于您是静态链接还是动态链接 CRT(因为这会影响是否有 THREAD_ATTACH 回调)。

通过仅在以 _beginthreadex 开始的线程上进行 CRT 调用,尝试“正确”地做到这一点。 (一种方法是继续使用CreateThread,然后在工作线程中使用ReadConsole代替getchar,另一种是使用_beginthreadex 而不是 CreateThread)。

关于windows - 为什么另一个线程中的阻塞 IO 会阻止 CreateWindowEx() 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922825/

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