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