码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-10-23 18:04:13      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:email   一个   stream   des   mes   结构   getc   out   str   

一:介绍

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

  临界区在使用时以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 }

 

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

标签:email   一个   stream   des   mes   结构   getc   out   str   

原文地址:https://www.cnblogs.com/woniu201/p/9837463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!