我有一個使用兩個線程的C++ Win32應用程序。 線程A使用AllocConsole()
創建控制檯窗口。 線程B使用WriteFile
打印到控制檯手柄中(從GetStdHandle
獲取)。Win32控制檯代碼在哪裏運行?從多線程使用控制檯掛起
由於某些原因,當兩個線程同時打印到控制檯時,我的進程掛起。
我該如何解決這個問題?是什麼導致了它? 我想調試控制檯的消息循環(這是一個窗口的權利?所以它應該有消息),但我不知道如何訪問它?
我有一個使用兩個線程的C++ Win32應用程序。 線程A使用AllocConsole()
創建控制檯窗口。 線程B使用WriteFile
打印到控制檯手柄中(從GetStdHandle
獲取)。Win32控制檯代碼在哪裏運行?從多線程使用控制檯掛起
由於某些原因,當兩個線程同時打印到控制檯時,我的進程掛起。
我該如何解決這個問題?是什麼導致了它? 我想調試控制檯的消息循環(這是一個窗口的權利?所以它應該有消息),但我不知道如何訪問它?
既然你沒有提供任何代碼,我只是拋出一個受過教育的猜測在這裏:
據我所知推移,
Win32控制檯類不是線程安全的(不像
System.Console類在.NET中它是線程安全的)。
這基本上意味着你應該做一些同步來防止任何錯誤;我不知道那裏是否存在這樣的問題。
請提供我們的代碼。
編輯:
請檢查Raymond Chen的評論。
控制檯是線程安全的,但它是同步的。這意味着如果[一個線程正在從控制檯讀取,另一個線程無法寫入](http://blogs.msdn.com/b/oldnewthing/archive/2011/12/02/10243553.aspx)。 –
因此,多次寫入應該會很好嗎? – Fingolfin
每次寫入都等待先前的寫入完成。 –
我懷疑問題出在使用相同的設備句柄併發呼叫到WriteFile()
。
每個線程都需要它自己的設備句柄。只需在主線程中通過HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)
將其拉出,然後在兩個線程中使用它以執行WriteFile(HANDLE, ...)
肯定無法工作。
解決此問題的直接方法是使用CONOUT$
通過調用CreateFile()
來讓每個線程都有自己的值HANLDE
。
在OP的情況下,只有線程B需要通過調用CreateFile()
來創建它自己的句柄,線程A可以使用由GetStdHandle()
返回的值,因爲它分配了控制檯。
有關如何在「備註」部分爲「控制檯」創建控制檯的設備手柄see here。
得到任何代碼去與描述? – WhozCraig
請您詳細說明'* ... gets hang。*'。 – alk