线程同步(windows平台):临界区

Posted woniu201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程同步(windows平台):临界区相关的知识,希望对你有一定的参考价值。

一:介绍

       临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性。有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

  临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。

二:步骤

  1. 创建临界区对象:CRITICAL_SECTION critical
  2. 初始化临界区:InitializeCriticalSection(&critical)
  3. 进入临界区:EnterCriticalSection(&critical)
  4. 释放临界区:LeaveCriticalSection(&critical)

三:代码实现

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t12
 4 Author:            woniu201
 5 Email:             [email protected]
 6 Created:           2018/10/23
 7 Description:    线程同步-临界区
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11 using namespace std;
12 
13 volatile int number = 1;
14 CRITICAL_SECTION critical;  //临界区句柄
15 
16 DWORD CALLBACK ThreadFun1(LPVOID pParam)
17 {
18     while (1)
19     {
20         EnterCriticalSection(&critical);
21         cout << "Thread1:" << number++ << endl;
22         if (number >= 1000)
23         {
24             break;
25         }
26         LeaveCriticalSection(&critical);
27     }
28     
29     return 0;
30 }
31 
32 DWORD CALLBACK ThreadFun2(LPVOID pParam)
33 {
34     while (1)
35     {
36         EnterCriticalSection(&critical);
37         cout << "Thread2:" << number++ << endl;
38         LeaveCriticalSection(&critical);
39         if (number >= 1000)
40         {
41             break;
42         }
43     }
44     return 0;
45 }
46 
47 
48 int main()
49 {
50     InitializeCriticalSection(&critical);
51     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
52     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
53 
54     getchar();
55     return 1;
56 }

 

以上是关于线程同步(windows平台):临界区的主要内容,如果未能解决你的问题,请参考以下文章

同步互斥的实现

Windows线程同步

线程同步之临界区

线程同步(临界区的使用)

多线程多线程同步_Critical Section临界区

线程同步的几种方式