繁体   English   中英

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

[英]Win32 Where is the console code running? Console hang when used from multiple threads

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

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

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

既然你没有提供任何代码,我会在这里抛出一个有根据的猜测:

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

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

请向我们提供代码。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM