我在C ++中有一个使用两个线程的Win32应用程序。
线程A使用AllocConsole()
创建控制台窗口。
线程B使用WriteFile
打印到此控制台中的控制台句柄(来自GetStdHandle
)。
出于某种原因,当两个线程同时打印到控制台时,我的进程会挂起。
如何修复此挂起?是什么导致的? 我想调试控制台的消息循环(它是一个窗口对吗?所以它应该有消息)但我不知道如何访问它?
答案 0 :(得分:2)
由于你没有提供任何代码,我只是在这里抛出一个有根据的猜测:
据我所知, Win32 Console类不是线程安全的(与.NET中的 System.Console类不同,它是线程安全的)。
这基本上意味着你应该做一些同步来防止任何错误;我不知道那里的挂起是否是由这样的问题引起的。
请向我们提供代码。
修改强>
请检查Raymond Chen的评论。
答案 1 :(得分:0)
我怀疑问题在于通过并发调用WriteFile()
来使用相同的设备句柄。
每个线程都需要自己的设备句柄。只需通过主线程中的HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)
拉出它然后在两个线程中使用它来执行WriteFile(HANDLE, ...)
肯定是行不通的。
解决此问题的直接方法是通过使用HANLDE
调用CreateFile()
让每个帖子都有CONOUT$
的值。
在OP的情况下,只有线程B需要通过调用CreateFile()
创建自己的句柄,线程A可以使用GetStdHandle()
返回的值,因为它分配了控制台。
如何在“备注”部分为“控制台”创建控制台see here的设备句柄。