0

我有一个使用两个线程的 C++ Win32 应用程序。线程 A 使用AllocConsole(). WriteFile线程 B 使用控制台句柄(从 获取)打印到此控制台GetStdHandle

出于某种原因,当两个线程同时打印到控制台时,我的进程挂起。

我该如何解决这个挂起?是什么原因造成的?我想调试控制台的消息循环(它是一个窗口,对吧?所以它应该有消息)但我不知道如何访问它?

4

2 回答 2

2

由于您没有提供任何代码,因此我将在这里进行有根据的猜测:

据我所知,Win32 Console 类不是线程安全的(与.NET 中的 System.Console 类不同,后者是线程安全的)。

这基本上意味着您应该进行一些同步以防止任何错误;我不知道那里的挂起是否是由这样的问题引起的。

请向我们提供代码。

编辑:
请查看 Raymond Chen 的评论。

于 2012-10-28T15:45:35.253 回答
0

我怀疑问题在于并发调用使用相同的WriteFile()设备句柄。

每个线程都需要它自己的设备句柄。简单地HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)在主线程中拉它然后在两个线程中使用它来做WriteFile(HANDLE, ...)最肯定是行不通的。

HANLDE解决这个问题的直接方法是通过调用CreateFile()using让每个线程都有自己的值CONOUT$

在 OP 的情况下,只有线程 B 需要通过调用来创建自己的句柄CreateFile(),线程 A 可以使用返回的值GetStdHandle(),因为它分配了控制台。

有关如何为控制台创建设备句柄,请参见此处“备注”部分中的“控制台”。

于 2012-10-28T16:28:06.230 回答