Win32控制台代码在哪里运行?从多个线程使用时控制台挂起

时间:2012-10-28 14:44:15

标签: c++ c multithreading winapi console

我在C ++中有一个使用两个线程的Win32应用程序。 线程A使用AllocConsole()创建控制台窗口。 线程B使用WriteFile打印到此控制台中的控制台句柄(来自GetStdHandle)。

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

如何修复此挂起?是什么导致的? 我想调试控制台的消息循环(它是一个窗口对吗?所以它应该有消息)但我不知道如何访问它?

2 个答案:

答案 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的设备句柄。