多執行緒時控制台輸出亂序的問題

2021-07-11 20:32:35 字數 732 閱讀 9211

我看到很多人對這樣乙個問題尋求幫助:在多執行緒時,往控制台視窗輸出的內容是亂序的。舉個非常簡單的例子,如下:

#include "stdafx.h"

#include using namespace std;

dword winapi threadproc1(

lpvoid lpparameter

){ int i=0;

while ( i<20 )

{cout<<"first thread cout:"<

建立了兩個子執行緒,每個子執行緒各自輸出內容。執行結果:控制台上輸出的內容是亂序的,而且每次結果不盡相同。

原因:往控制台視窗輸出的過程(cout)並不是多執行緒安全的,在乙個執行緒輸出過程中另乙個執行緒也可以輸出。

解決辦法:對輸出出進行同步,利用臨界區就可以很容易辦到。**修改如下:

critical_section g_cs; //定義乙個臨界區

initializecriticalsection( &g_cs ); //在程式開始的地方,對臨界區初始化

在所有涉及到輸出的地方改為:

entercriticalsection( &g_cs );

cout<<"first thread cout:"<

總結:在編寫多執行緒的程式時,一定要特別注意同步的問題,仔細的考慮清楚哪些變數、資源、操作需要進行同步,否則就會得到莫名其妙的結果。

**:

Python 多執行緒控制台輸出錯亂

多執行緒在使用print 時,會在控制台上出現形如以下的錯亂顯示 簡單搜尋了一下,網上有說 python3 的print是執行緒安全的,但是我這個是 python 3.8.5 啊。再仔細看一下,發現只有換行是錯亂的。這裡我想到了print 是自動新增換行的,可能這個新增換行的時候不是執行緒安全的,於...

控制台輸出中文亂碼問題

問題描述 cout 中文字元 在控制台輸出時出現亂碼。解決辦法 重新點出選單,選 預設值 項,發現 預設值 裡的 當前 頁 是可以設定,有兩個選項 437 oem 美國 和 936 ansi oem 簡體中文 gbk 將 當前 頁 設定為 936 ansi oem 簡體中文 gbk 點 確定 沒有發...

BCB控制台輸出中文的問題

bcb6控制台輸出中文是沒有問題的,但是wcout輸出寬字元中文 wchar t 是不正常的,但wprintf輸出是正常的。在cb10中可以設定 setlocale lc ctype,wprintf wcout.imbue locale lc ctype cb10 可行 但在cb6中是不行的,而co...