C++マルチスレッド基礎学習ノート(十)
6186 ワード
一、Windows臨界区の基本的な使い方
CRITICAL_SECTION my_winsc;//Windowsの臨界領域を定義し、mutex変数に相当する
InitializeCriticalSection(&my_winsc);//初期化
EnterCriticalSection(&my_winsc);//臨界域に入るとlock()に相当
LeaveCriticalSection(&my_winsc);//臨界域を離れる、unlock()に相当
スレッドthread_1印刷1-50、スレッドthread_2印刷51-100
二、Windowsの臨界領域とmutexの違い
1.mutexは独立反発量であり、臨界領域は再帰的独立反発量であり、同じmutex反発量は1つのスレッドエントリ関数で1回しかlockできないが、本例では複数回臨界領域に入ることができ、すなわち複数回のロックを使用することができ、対応するロック解除の対応回数だけでよい
2.Windowsの臨界領域は初期化しなければならない
CRITICAL_SECTION my_winsc;//Windowsの臨界領域を定義し、mutex変数に相当する
InitializeCriticalSection(&my_winsc);//初期化
EnterCriticalSection(&my_winsc);//臨界域に入るとlock()に相当
LeaveCriticalSection(&my_winsc);//臨界域を離れる、unlock()に相当
スレッドthread_1印刷1-50、スレッドthread_2印刷51-100
1 #include
2 #include
3 #include
4 using namespace std;
5
6 int Count = 0;
7 CRITICAL_SECTION my_winsc; // Windows , mutex
8
9 void mythead_1()
10 {
11 for (int i = 0; i < 50; i++)
12 {
13 EnterCriticalSection(&my_winsc); // , lock()
14 EnterCriticalSection(&my_winsc); // , lock()
15 Count++;
16 cout << std::this_thread::get_id() << " :" << Count << endl;
17 LeaveCriticalSection(&my_winsc); // , unlock()
18 LeaveCriticalSection(&my_winsc); // , unlock()
19 }
20 }
21
22 void mythread_2()
23 {
24 for (int i = 0; i < 50; i++)
25 {
26 EnterCriticalSection(&my_winsc);
27 Count++;
28 cout << std::this_thread::get_id() << " :" << Count << endl;
29 LeaveCriticalSection(&my_winsc);
30 }
31 }
32
33
34 int main()
35 {
36
37 InitializeCriticalSection(&my_winsc); //
38 thread thread_1(mythead_1);
39 thread thread_2(mythread_2);
40 thread_1.join();
41 thread_2.join();
42
43
44 system("pause");
45 return 0;
46 }
二、Windowsの臨界領域とmutexの違い
1.mutexは独立反発量であり、臨界領域は再帰的独立反発量であり、同じmutex反発量は1つのスレッドエントリ関数で1回しかlockできないが、本例では複数回臨界領域に入ることができ、すなわち複数回のロックを使用することができ、対応するロック解除の対応回数だけでよい
2.Windowsの臨界領域は初期化しなければならない