线程同步(windows平台):临界区
一:介绍
临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性。有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。
二:步骤
- 创建临界区对象:CRITICAL_SECTION critical
- 初始化临界区:InitializeCriticalSection(&critical)
- 进入临界区:EnterCriticalSection(&critical)
- 释放临界区: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编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。
作者:蜗牛201 出处:https://www.cnblogs.com/woniu201/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |