开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3352|回复: 3
收起左侧

[C#图文教程] 转载 多线程的那点儿事(之windows锁)

[复制链接]

结帖率:100% (5/5)
发表于 2012-6-27 10:57:52 | 显示全部楼层 |阅读模式   山西省临汾市
在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界区,互斥量,信号量,event。

    (1)临界区
    临界区是最简单的一种锁。基本的临界区操作有,
  1. print?InitializeCriticalSection   
  2. EnterCriticalSection   
  3. LeaveCriticalSection   
  4. DeleteCriticalSection  
复制代码
如果想要对数据进行互斥操作的话,也很简单,这样做就可以了,
  1. print?EnterCriticalSection(/*...*/)   
  2.     do_something();   
  3. LeaveCriticalSection(/*...*/)  
  4.     EnterCriticalSection(/*...*/)
  5.         do_something();
  6.     LeaveCriticalSection(/*...*/)
复制代码
(2)互斥锁
    互斥锁也是一种锁。和临界区不同的是,它可以被不同进程使用,因为它有名字。同时,获取锁和释放锁的线程必须是同一个线程。常用的互斥锁操作有
  1. [cpp] view plaincopyprint?CreateMutex   
  2. OpenMutex   
  3. ReleaseMutex  
复制代码
那么,怎么用互斥锁进行数据的访问呢,其实不难。
  1. WaitForSingleObject(/*...*/);   
  2.     do_something();   
  3. ReleaseMutex(/*...*/);
复制代码
(3)信号量
    信号量是使用的最多的一种锁结果,也是最方便的一种锁。围绕着信号量,人们提出了很多数据互斥访问的方案,pv操作就是其中的一种。如果说互斥锁只能对单个资源进行保护,那么信号量可以对多个资源进行保护。同时信号量在解锁的时候,可以被另外一个thread进行解锁操作。目前,常用的信号量操作有,
  1. [cpp] view plaincopyprint?CreateSemaphore   
  2. OpenSemaphore   
  3. ReleaseSemaphore  
复制代码
信号量的使用和互斥锁差不多。关键是信号量在初始化的时候需要明确当前资源的数量和信号量的初始状态是什么,
  1. WaitForSingleObject(/*...*/);   
  2.     do_something();   
  3. ReleaseSemaphore(/*...*/);  
复制代码
(4)event对象
    event对象是windows下面很有趣的一种锁结果。从某种意义上说,它和互斥锁很相近,但是又不一样。因为在thread获得锁的使用权之前,常常需要main线程调用SetEvent设置一把才可以。关键是,在thread结束之前,我们也不清楚当前thread获得event之后执行到哪了。所以使用起来,要特别小心。常用的event操作有,
  1. print?CreateEvent   
  2. OpenEvent   
  3. PulseEvent   
  4. ResetEvent   
  5. SetEvent  
复制代码
我们对event的使用习惯于分成main thread和normal thread使用。main thread负责event的设置和操作,而normal thread负责event的等待操作。在CreateEvent的时候,要务必考虑清楚event的初始状态和基本属性。
    对于main thread,应该这么做,
  1. CreateEvent(/*...*/);   
  2. SetEvent(/*...*/);   
  3. WaitForMultiObjects(hThread, /*...*/);   
  4. CloseHandle(/*...*/);  
复制代码
对于normal thread来说,操作比较简单,
  1. [cpp] view plaincopyprint?while(1){   
  2.     WaitForSingleObject(/*...*/);   
  3.    
  4.     /*...*/   
  5. }  
复制代码
总结:
    (1)关于临界区、互斥区、信号量、event在msdn上均有示例代码
    (2)一般来说,使用频率上信号量 > 互斥区 > 临界区 > 事件对象
    (3)信号量可以实现其他三种锁的功能,学习上应有所侧重
    (4)纸上得来终觉浅,多实践才能掌握它们之间的区别
发表于 2012-7-7 17:21:32 | 显示全部楼层   江苏省盐城市
{:3_227:}{:3_227:}{:3_227:}{:3_227:}{:3_227:}
回复 支持 反对

使用道具 举报

结帖率:0% (0/3)
发表于 2013-1-29 22:31:09 | 显示全部楼层   辽宁省大连市
很少用到啊
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 12 天

发表于 2025-1-5 11:06:10 | 显示全部楼层   江西省吉安市
其实你们每个地方都看得到我,我只是想要精币去下载才这么拼!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表