[英]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.