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

Why does blocked IO in another thread prevent CreateWindowEx() from returning

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

然后main()使用RegisterClass()注册一个windowclass并调用CreateWindowEx()创建一个隐形消息window.

但是 CreateWindowEx() 从来没有 return。

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

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

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

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

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

尝试 "right" 仅对以 _beginthreadex 开始的线程进行 CRT 调用。 (一种方法是继续使用CreateThread然后在工作线程中使用ReadConsole而不是getchar,另一种是使用_beginthreadex而不是CreateThread) .