為什麼要對多執行緒進行加鎖操作呢

2022-03-25 15:09:13 字數 1317 閱讀 7888

可能會發生資料競爭,造成資料錯亂.

例子:本來想要的結果n=0,但是執行發現n的值不為0,而且有多種取值.究其原因,是因為多個執行緒之間會發生資料競爭,導致cpu執行緒排程時出現問題,不能夠保證執行緒內執行**的原子操作.我發現string str = "hello";這一句是必要的,不然它就不會出現n不為0的現象.(有待進一步研究)

注意,如果要所有子執行緒執行完畢後,再執行主線程.要有waitformultipleobjects操作.

#include "

windows.h

"#include

using

namespace std;const

int threadnum = 50

;int g_num = 0

;dword winapi threadfun(

void *param)

return0;

}int

main()

waitformultipleobjects(threadnum, h, true, infinite); //等待所有的子執行緒執行完畢.

int n =g_num;

cout

<< "n:"

<< n

}

waitformultipleobjects是必須的,一開始忘記了使用這個,導致在entercriticalsection處報錯,猜測是主線程沒有等子執行緒執行完畢就結束了程式.為了驗證猜想,將waitformultipleobjects注釋掉,

在子函式中列印,發現確實是這個原因.

加鎖後每次n列印出來的都是0了.

#include "

windows.h

"#include

using

namespace

std;

const

int threadnum = 50

;critical_section g_cs;

int g_num = 0

;dword winapi threadfun(

void *param)

return0;

}int

main()

waitformultipleobjects(threadnum, h, true, infinite);

//等待所有的子執行緒執行完畢.

int n =g_num;

cout

<< "n:"

<< n

return0;

}

為什麼要對版權進行保護?

對版權進行保護其實也就是我們知道的對著作權進行保護,在法律上對著作權的保護是比較全面的。要是有人侵犯他人的著作權的話,則就要按照規定,承擔相應的責任,那麼你知道為什麼要保護版權嗎?一 我國民事立法的基本原則,維護了公民正當的民事權益,完善了我國智財權的法律制度。版權保 的實施,標誌著文學藝術領域無法...

為什麼要對DLL進行簽名

曾經在乙個專案中,要求您為dll建立乙個強名稱,並且為乙個專案建立乙個強名稱,然後編譯專案解決方案開始出現奇怪的編譯錯誤。我去過很多次。面對這些問題時,我有些疑問浮出水面。讓我們仔細閱讀以下基礎知識。我們將調查以下內容 組裝 加密 雜湊 數字簽名assembly assembly是用於部署,安全性和...

為什麼要對訊號進行調頻

一般無線裝置的待發射訊號都是低頻的,如果直接用天線發射這種低頻訊號,根據公式 波長 光速 頻率 計算出的天線長度會非常長,可能是2m,可能是十幾公尺,也有可能是將近百公尺,試想一下,你手機的天線 路由器的天線有幾公尺長會是什麼樣子的,太滑稽了。而2.4g訊號和5g訊號需要d天線長度在幾厘公尺到十幾厘...