我有一个非常简单的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
)。