我有一个非常简单的Windows控制台应用程序,它首先创建一个线程来处理stdin上的输入。它使用CreateThread()
中的main()
来创建线程,线程所做的第一件事是调用getchar()
并阻塞,等待。
然后main()
使用RegisterClass()
注册一个窗口类,并调用CreateWindowEx()
来创建一个不可见的消息窗口。
但是CreateWindowEx()
永远不会回来。
如果我删除了帖子中的getchar()
并将其替换为while (1) Sleep(1000);
,那么一切正常。
如果我将Sleep(1000);
添加到线程函数的开头,CreateWindowEx()
调用成功,但线程中的I / O停止工作(getchar()
不返回)。
为什么阻塞的第二个线程会干扰第一个?
答案 0 :(得分:2)
C运行时库不正式支持从使用CreateThread
生成的线程调用。您应该使用CRT包装器函数,例如_beginthreadex
,它可以在新线程上正确配置CRT线程本地状态。
在实践中,即使你破坏了规则,CRT也会竭尽全力使事情有效,但细节取决于你是否静态或动态地与CRT联系(因为这会影响是否有{{1}回调)。
尝试通过仅使用THREAD_ATTACH
启动的线程进行CRT调用来“正确”执行此操作。 (一种方法是继续使用_beginthreadex
,然后在工作线程中使用CreateThread
而不是ReadConsole
,另一种方法是使用getchar
代替_beginthreadex
)