1、临界区对象

临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录一些同步信息,确保在同一段时间只有一个线程访问数据段中的数据。

临界区对象相关函数:

// 初始化临界区对象资源
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);// 进入临界区
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);// 离开临界区
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);// 删除临界区对象资源
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

函数参数lpCriticalSection为指向临界区源的对象

2、临界区对象实例 

#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;int g_Cnt = 0; // 计数器
CRITICAL_SECTION g_cs;  // 临界区对象
BOOL bFlag = FALSE;// 判断是否创建辅助线程UINT _stdcall ThreadFunc(LPVOID lpParam);int main()
{UINT uId[2];HANDLE h[2];::InitializeCriticalSection(&g_cs);  // 初始化临界区资源h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId[0]);h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId[1]);// 标志创建了辅助线程bFlag = TRUE;  // 主线程休息1000ms,让出CPU的使用权,让我们的辅助线程有运行的机会Sleep(1000);// 主线程运行bFlag = FALSE;::WaitForMultipleObjects(2, h, TRUE, INFINITE);// 关闭句柄CloseHandle(h[0]);CloseHandle(h[1]);::DeleteCriticalSection(&g_cs);  // 清除临界区资源printf("g_Cnt = %d\n", g_Cnt);system("pause");return 0;
}UINT _stdcall ThreadFunc(LPVOID lpParam)
{if (bFlag){::EnterCriticalSection(&g_cs); for (int i =0;i< 10000;i++)g_Cnt++;::LeaveCriticalSection(&g_cs);}return 0;
}

临界区对象能很好的保护共享数据,但是它不能够用于进程之间资源的锁定,因为它不是内核对象,如果要在进程间维持线程的同步,可以使用事件内核对象。

3、互锁函数

互锁函数为同步访问多线程共享变量提供了一个简单的机制。

如果变量在共享内存,不同进程的线程也可以使用此机制。

互锁函数:

// 原子自加操作
InterlockedIncrement// 原子自减操作
InterlockedDecrementInterlockedExchangeAddInterlockedExchangePointer

4、实例 

#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;int g_Cnt = 0; // 计数器
BOOL bFlag = FALSE;// 判断是否创建辅助线程UINT _stdcall ThreadFunc(LPVOID lpParam);int main()
{UINT uId[2];HANDLE h[2];h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId[0]);h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId[1]);// 标志创建了辅助线程bFlag = TRUE;  // 主线程休息1000ms,让出CPU的使用权,让我们的辅助线程有运行的机会Sleep(1000);// 主线程运行bFlag = FALSE;::WaitForMultipleObjects(2, h, TRUE, INFINITE);// 关闭句柄CloseHandle(h[0]);CloseHandle(h[1]);printf("g_Cnt = %d\n", g_Cnt);system("pause");return 0;
}UINT _stdcall ThreadFunc(LPVOID lpParam)
{if (bFlag){for (int i = 0; i < 10000; i++)// 原子自加操作,不会被中断InterlockedIncrement((long *)&g_Cnt);}return 0;
}

通过本节的学习,我们知道了如何控制关键的代码段不被系统打断,可以通过临界区或者互锁函数来实现关键代码段不被系统打断,可以保证数据得出正确的结果!

C++系列 --- 线程同步临界区原理相关推荐

  1. iOS开发系列-线程同步dispatch_barrier_async

    //参数1:将barrier添加到的队列 //参数2:barrier执行的block void dispatch_barrier_async(dispatch_queue_t queue, dispa ...

  2. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

  3. JAVA并发编程3_线程同步之synchronized关键字

    在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public clas ...

  4. 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行,虽然说可以通过线程的优先权进行设置,但是他只是获取CUP执行权的概率高点,但是也不一定必须先执行.在这种情况下如何保证线程按照一 ...

  5. C++多线程并发(三)---线程同步之条件变量

    文章目录 一.何为条件变量 二.为何引入条件变量 三.如何使用条件变量 更多文章: 一.何为条件变量 在前一篇文章<C++多线程并发(二)-线程同步之互斥锁>中解释了线程同步的原理和实现, ...

  6. 操作系统哲学原理(08)线程原理-线程同步

    说明:该系类文章更多的是从从哲学视角看 操作系统 这门学科.同时也是 操作系统的学习笔记总结.因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主,因此这个系类文章也是这两个领域不可或缺的基石 ...

  7. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  9. C#线程同步(1)- 临界区&Lock

    文章原始出处 http://xxinside.blogbus.com/logs/46441956.html 预备知识:线程的相关概念和知识,有多线程编码的初步经验. 一个机会,索性把线程同步的问题在C ...

最新文章

  1. 用异或来交换两个变量能提快速度是错误的
  2. Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password
  3. linux新建普通用户
  4. Ubuntu安装报错E: Could not get lock /var/lib/dpkg/lock-frontend
  5. 热烈祝贺新疆.Net俱乐部博客开通——天下博客开通
  6. 33.启动流程,模块管理与 Loader
  7. 凸优化第四章凸优化问题 4.1优化问题
  8. cad汉仪长仿宋体_工程制图国标字体“长仿宋体”下载
  9. 网络舆情分析系统具体使用功能及作用详解
  10. 微信公众号运营技巧总结
  11. 电子表整点报时怎么取消_双11红包雨入口在哪 双十一秒杀券怎么抢
  12. 请同学吃饭她带来6人,我中途逃单:不是小气,而是不吃“苍蝇”
  13. python 使用while循环输出*组成的菱形_python实现while循环打印星星的四种形状
  14. 【超人】社区二手6.15.2小程序源码
  15. Java集合--阻塞队列(ArrayBlockingQueue)
  16. leetcode 6 z字型变换
  17. 618新手必看:电视盒子哪个好?热销网络电视盒子排行榜
  18. 界面与程序分离--MIS开发新方法
  19. unity 的动作共用和纸娃娃装备
  20. 2020牛客暑期多校训练营(第二场)未完待续......

热门文章

  1. MySQL 可重复读隔离级别与幻读
  2. php评论盖楼怎么实现,dedecms评论盖楼实现楼层数,类似腾讯、网易的评论(5.5/5.6版)...
  3. 东哥上热搜的样子,真像蔡徐坤
  4. uboot和系统移植-第1部分-2.1 uboot学习前传
  5. Win7远程桌面防火墙设置
  6. 2022-2028全球与中国钓鱼器材市场现状及未来发展趋势
  7. 三诺+n20g+微型计算机,绝对超值 三诺N20G传承版新品仅卖199
  8. Premiere Pro CC2020看了必懂
  9. 包邮送88本畅销技术书
  10. ECS搭建nginx服务器在阿里云