线程的临界区
臨界區解決線程沖突問題,多個線程操作同一個變量,會引發這樣對待問題。
注意:不要讓多個程序同時訪問一個變量,如果要訪問,急用臨界區來操作,或讓他們每個時間段每個時間段來訪問。
1.下面的程序中,得到的正確結果應該是200000,但是它實際上得到的結果極其不穩定,同時運行每一個線程,可能會有幾個就漏掉了,最后得到的結果也就不穩定了。
#include <stdio.h> #include <stdlib.h> #include <Windows.h> #define N 20int num = 0; DWORD WINAPI add(void *p) {for (int i = 0; i < 10000, i++){num++;} }int main() {HANDLE hd[N];for (int i = 0; i < N; i++){hd[i] = CreatThread(NULL, 0, add, NULL, 0, NULL);}WaitForMultipleObjects(N, hd, TRUE, INFINITE);//等待全部退出pirntf("num-%d", num);system("pause"); }2要想讓他正確有兩種方法
*1*
#include <stdio.h> #include <stdlib.h> #include <Windows.h> #define N 20int num = 0; DWORD WINAPI add(void *p) {for (int i = 0; i < 10000, i++){num++;} }int main() {HANDLE hd[N];for (int i = 0; i < N; i++){hd[i] = CreatThread( NULL, 0, add, NULL, 0, NULL);WaitForSingleObject(hd[i], INFINITE); //加入的這一行后,
//進程是一個一個進行的,不會出錯,但是如果單個進程時間長,最后花費的時間會很長。 }WaitForMultipleObjects(N, hd, TRUE, INFINITE);//等待全部退出pirntf("num-%d", num);system("pause"); }
*2* 通過臨界區
?
#include <stdio.h> #include <stdlib.h> #include <Windows.h> #define N 20int num = 0;CRITICAL_SECTION cs1
CRITICAL_SECTION cs2; //定義臨界區,其實質是一個結構體變量,
當訪問cs的時候其他線程都是鎖定的,至少處于一個等待狀態。 DWORD WINAPI add(void *p) {
EnterCriticalSection(&cs1); //進入臨界區for (int i = 0; i < 10000, i++){
num++;
}
LeaveCriticalSection(&cs1); }
int main()
{
InitializeCriticalSection(&cs1); //初始化 ,C++會自動初始化
HANDLE hd[N];
for (int i = 0; i < N; i++)
{
hd[i] = CreatThread(NULL, 0, add, NULL, 0, NULL);
}
WaitForMultipleObjects(N, hd, TRUE, INFINITE);//等待全部退出
pirntf("num-%d", num);
DeleteCriticalSection(&cs1); //釋放,由于該結構體中有指針,這個指針會在堆上開辟內存system("pause"); }
?
臨界區特點:臨界區支持的最大線程是64。
?
轉載于:https://www.cnblogs.com/sjxbg/p/5767527.html
總結
- 上一篇: outdated: 29.Blitter
- 下一篇: struts通过Ajax返回数据时,例如