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

线程同步(windows平台):临界区有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。

大家好,欢迎来到IT知识分享网。

一:介绍

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

临界区在使用时以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平台):临界区

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48489.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信