线程同步(windows平台):临界区
一:介绍
临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性。有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。
二:步骤
- 创建临界区对象:CRITICAL_SECTION critical
- 初始化临界区:InitializeCriticalSection(&critical)
- 进入临界区:EnterCriticalSection(&critical)
- 释放临界区:LeaveCriticalSection(&critical)
三:代码实现
/********************************************************
Copyright (C), 2016-2018,
FileName: t12
Author: woniu201
Email: wangpengfei.201@163.com
Created: 2018/10/23
Description: 线程同步-临界区
********************************************************/
#include <iostream>
#include <Windows.h>
using namespace std; volatile int number = ;
CRITICAL_SECTION critical; //临界区句柄 DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while ()
{
EnterCriticalSection(&critical);
cout << "Thread1:" << number++ << endl;
if (number >= )
{
break;
}
LeaveCriticalSection(&critical);
} return ;
} DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while ()
{
EnterCriticalSection(&critical);
cout << "Thread2:" << number++ << endl;
LeaveCriticalSection(&critical);
if (number >= )
{
break;
}
}
return ;
} int main()
{
InitializeCriticalSection(&critical);
CreateThread(NULL, , ThreadFun1, NULL, , NULL);
CreateThread(NULL, , ThreadFun2, NULL, , NULL); getchar();
return ;
}

扫码关注公众号
专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。
线程同步(windows平台):临界区的更多相关文章
- 线程同步(windows平台):信号量
一:介绍 信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目. 信号量遵循规则:1.当前资源计数大于0,信号量有效.2.当前资源计数等于0,信号量无效. ...
- 线程同步(windows平台):事件
一:介绍 事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态.分两种类型:手动处置事件和自动处置事件.手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到 ...
- 线程同步(windows平台):互斥对象
一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象: HANDLE CreateMutex( LPSECURITY_ ...
- Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其 ...
- C++线程同步 -- windows
简介: 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程.但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入, 由于CPU时间调度上的问题,写入 ...
- 关于windows线程同步的四种方法
#include "stdafx.h" #include "iostream" #include "list" #include " ...
- Windows线程同步(上)
先介绍一个创建线程的API,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx ...
- C#编程总结(三)线程同步
C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多 ...
- [转]C#编程总结(三)线程同步
本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...
随机推荐
- Head First HTML与CSS、XHTML (中文版).(Elisabeth Freeman) PDF扫描版
面对那些晦涩的html书你不禁要问:“难道要成为专家之后才能读懂这些?”那么,你应该选择<head first html与css.xhtml(中文版)>真正来学习html.这本书对你来说, ...
- 分别实现数组所有元素相加、相乘、相与——FP 风格
var ops = { "plus": (x,y)=>x+y, "mul" : (x,y)=>x*y, "and" : (x,y ...
- NSStream文件流
1.文件流的使用 NSString *filePath = @"/Users/JHQ0228/Desktop/test.txt"; NSData *data = [@"h ...
- 前端中onload与ready的区别
Jquery的ready()与Javascrpit的load() 1 window.onload() $(document).ready() 加载时机 必须等待网页全部加载完毕(包括图片等),然后再执 ...
- linux系统使用sh文件传参数给matlab程序
linux系统下使用sh文件传参数给matlab程序 (1)编写sh文件 程序以下面的行开始(必须在文件的第一行): #!/bin/sh 定义需要传递的参数,用双引号引起,参数之间使用逗号或分 ...
- kali linux之服务扫描
识别开放端口上运行的应用.识别目标操作系统,提高攻击效率 banner捕获(软件开发商,软件名称,服务类型,版本号-----直接发现已知的漏洞和弱点) 服务识别 操作系统识别 snmp分析(简单网络管 ...
- LoadRunner11_MySQL数据库脚本
记录一次压测过程中,通过LoadRunner向MySQL数据库插入大量数据的过程. [1]需要使用到MySQL的libmysql.dll动态链接库,因此需要安装MySQL:注:本地安装的MySQL最好 ...
- LAMP课程
LAMP课程 上次课回顾: ls -a:查看全部目录内容 若文件名以“.”开头,则认为是隐藏的文件. ls-l:可以直接用命令 ll命令:ls -l 的别名. ls -m:横向显示文件和目录 ls - ...
- Python变量类型的强制转换
当我们需要对数据的类型转换时,只需要将数据类型作为函数名即可. 下面给出的函数可以执行数据类型之间的转换,函数返回一个新的对象,表示转换的值 函数格式 使用示例 描述 int(x [,base]) i ...
- c语言数据结构学习心得——数据结构基本概念
1.数据>数据元素>数据项 数据的基本单位是数据元素,数据元素的基本单位是数据项 2.运算的定义->针对逻辑结构 集合:同属于一个集合,无其他关系.(数学上的集合) 线性结 ...