zoukankan      html  css  js  c++  java
  • 线程同步(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:             wangpengfei.201@163.com
     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 }

    扫码关注公众号

    专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

  • 相关阅读:
    软件工程逃课小组——冲刺集合
    软件工程逃课小组——冲刺日志(第一天)
    2020软件工程作业05
    软工实践第四次作业
    第三次
    第二次作业
    2020软件工程作业01
    Ubantu18安装SU(Seismic Unix)脚本
    Win10下通过anaconda搭建新环境并安装tensorflow-gpu
    Win10安装虚拟机(Ubantu18.04)并安装seismic unix(SU)
  • 原文地址:https://www.cnblogs.com/woniu201/p/9837463.html
Copyright © 2011-2022 走看看