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

我有一个非常简单的Windows控制台应用程序,首先创build一个线程来处理stdin上的input。 它使用main() CreateThread()来创build线程,线程所做的第一件事就是调用getchar()和block,等待。

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

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

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

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

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

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

在实践中,即使违反了规则,CRT也会竭尽全力,但是细节取决于你是否静态或动态链接到CRT(因为影响是否有THREAD_ATTACH回调)。

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