多线程的那点儿事(之windows锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界区,互斥量,信号量,event。
(1)临界区
临界区是最简单的一种锁。基本的临界区操作有,
InitializeCriticalSectionEnterCriticalSectionLeaveCriticalSectionDeleteCriticalSection
如果想要对数据进行互斥操作的话,也很简单,这样做就可以了,
EnterCriticalSection(/*...*/)do_something();LeaveCriticalSection(/*...*/)
(2)互斥锁
互斥锁也是一种锁。和临界区不同的是,它可以被不同进程使用,因为它有名字。同时,获取锁和释放锁的线程必须是同一个线程。常用的互斥锁操作有
CreateMutexOpenMutexReleaseMutex
那么,怎么用互斥锁进行数据的访问呢,其实不难。
WaitForSingleObject(/*...*/);do_something();ReleaseMutex(/*...*/);
(3)信号量
信号量是使用的最多的一种锁结果,也是最方便的一种锁。围绕着信号量,人们提出了很多数据互斥访问的方案,pv操作就是其中的一种。如果说互斥锁只能对单个资源进行保护,那么信号量可以对多个资源进行保护。同时信号量在解锁的时候,可以被另外一个thread进行解锁操作。目前,常用的信号量操作有,
CreateSemaphoreOpenSemaphoreReleaseSemaphore
信号量的使用和互斥锁差不多。关键是信号量在初始化的时候需要明确当前资源的数量和信号量的初始状态是什么,
WaitForSingleObject(/*...*/);do_something();ReleaseSemaphore(/*...*/);
(4)event对象
event对象是windows下面很有趣的一种锁结果。从某种意义上说,它和互斥锁很相近,但是又不一样。因为在thread获得锁的使用权之前,常常需要main线程调用SetEvent设置一把才可以。关键是,在thread结束之前,我们也不清楚当前thread获得event之后执行到哪了。所以使用起来,要特别小心。常用的event操作有,
CreateEventOpenEventPulseEventResetEventSetEvent
我们对event的使用习惯于分成main thread和normal thread使用。main thread负责event的设置和操作,而normal thread负责event的等待操作。在CreateEvent的时候,要务必考虑清楚event的初始状态和基本属性。
对于main thread,应该这么做,
CreateEvent(/*...*/);SetEvent(/*...*/);WaitForMultiObjects(hThread, /*...*/);CloseHandle(/*...*/);
对于normal thread来说,操作比较简单,
while(1){WaitForSingleObject(/*...*/);/*...*/}
总结:
(1)关于 临界区、 互斥区、 信号量、 event在msdn上均有示例代码
(2)一般来说,使用频率上信号量 > 互斥区 > 临界区 > 事件对象
(3)信号量可以实现其他三种锁的功能,学习上应有所侧重
(4)纸上得来终觉浅,多实践才能掌握它们之间的区别
多线程的那点儿事(之windows锁)相关推荐
- 多线程的那点儿事(之大结局)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- MFC实现Windows锁屏
编辑 Windows锁屏 锁屏软件相信大家都见过,以前我去网吧上网的时候也用过这个功能,当你有事情需要立即离开,而又不想让别人碰你的电脑,就需要用扫锁屏软件啦,锁住屏幕之后等回来的时候再输入密码解锁. ...
- 一键获取Windows锁屏壁纸
一键获取Windows锁屏壁纸 win10锁屏壁纸每日一图,图片质量相当赞,但奈何系统并没有提供保存方法,每次发现自己喜欢的壁纸都要手动去壁纸的保存目录一个个的找啊翻啊,真心麻烦,而且与壁纸一起存放的 ...
- 获取windows锁屏壁纸
1.找到windows锁屏壁纸的缓存位置 win+r,在运行框中输入 %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_ ...
- php 锁屏,windows锁屏快捷键是什么
windows锁屏快捷键是"win+L".具体方法:直接按住键盘上的"win+L"组合快捷键即可快速锁屏:也可以点击windows10左下角的"开始& ...
- 基于多线程技术和自定义消息编程实现Windows 9x异步串行通信
基于多线程技术和自定义消息编程实现Windows 9x异步串行通信 张志明 李蓉艳 王 磊 摘 要 分析了基于Windows 95/98平台上的异步串行通信程序开发方法,并结合开发实践,用C++B ...
- 查看/删除 Windows锁屏及桌面 历史记录
Windows 默认锁屏壁纸路径:C:\Windows\Web\Screen Windows 默认桌面壁纸路径:C:\Windows\Web\Wallpaper Windows图片内容缓存: C:\U ...
- 一键获取windows锁屏壁纸 Windows聚焦
reference:https://blog.csdn.net/shuangjin0056/article/details/79604474 一键获取Windows锁屏壁纸 win10锁屏壁纸每日一图 ...
最新文章
- CocoaPods私有库创建
- jquery extend函数
- multipart/form-data ajax 提交问题(未解决)
- 【牛客 - 370E】Rinne Loves Gift(Bellman_Ford判负环,二分,分数规划)
- ASP.NET 控制页和内容页中的事件
- 写ios系统和安卓系统的人到底有多牛?
- JavaScript数组操作 [Z]
- 纯html 404页面,一款纯css3实现的漂亮的404页面_html/css_WEB-ITnose
- 计算机二级access无忧考吧破解,无忧考吧access模拟考试软件
- 什么是 Win10 五月更新版?附Win10 1903更新文件下载
- 计算机u盘启动进不去怎么办,U盘启动盘怎么进不了PE系统 该如何解决
- 关于软件设计使用中一些的原则简述
- Maximo 密码加密传送
- 全球及中国游戏耳机行业销售模式与动态盈利分析报告2022版
- Internet Explorer 编程简述(序)
- 【CSS进阶】使用CSS gradient制作绚丽渐变纹理背景效果
- 新品PDF黄钻换器在线
- PHP关于实现腾讯云直播的推流和拉流
- 记一次阿里电话面试| 技术征文
- 最佳编程语言_2020年最佳职业和未来编程语言
热门文章
- 入行AI最需要的五大技能
- 第二届大数据世界论坛 聚焦行业需求
- netty源码解解析(4.0)-5 线程模型-EventExecutorGroup框架
- python-同步(互斥)锁、递归锁、同步条件(event)
- eclipse中ctrl+h默认打开是JavaSearch,怎么设置成默认打开是FileSearch
- GitBook是一个命令行工具(Node.js库),我们可以借用该工具使用Github/Git和Markdown来制作精美的图书,但它并不是一本关于Git的教程哟。...
- Qt Package Project 打包发布程序
- Java读取Properties文件的六种方法
- 【2011.9.29】得到明天的时间,得到明天某时刻和现在的时间差(毫秒)
- netfilter与用户空间通信