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

时间:2015-04-28 14:59:04

标签: windows multithreading winapi io nonblocking

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

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

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

如果我删除了帖子中的getchar()并将其替换为while (1) Sleep(1000);,那么一切正常。

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

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

1 个答案:

答案 0 :(得分:2)

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

在实践中,即使你破坏了规则,CRT也会竭尽全力使事情有效,但细节取决于你是否静态或动态地与CRT联系(因为这会影响是否有{{1}回调)。

尝试通过仅使用THREAD_ATTACH启动的线程进行CRT调用来“正确”执行此操作。 (一种方法是继续使用_beginthreadex,然后在工作线程中使用CreateThread而不是ReadConsole,另一种方法是使用getchar代替_beginthreadex