为什么另一个线程中的阻塞 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
) .
我有一个非常简单的 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
) .