开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 8692|回复: 6
收起左侧

[C#图文教程] 多线程的那点儿事(之原子锁)

[复制链接]

结帖率:100% (5/5)
发表于 2012-6-27 11:00:57 | 显示全部楼层 |阅读模式   山西省临汾市
   原子锁是多线程编程中的一个特色。然而,在平时的软件编写中,原子锁的使用并不是很多。这其中原因很多,我想主要有两个方面。第一,关于原子锁这方面的内容介绍的比较少;第二,人们在编程上面习惯于已有的方案,如果没有特别的需求,不过贸然修改已存在的代码。毕竟对很多人来说,不求有功,但求无过。保持当前代码的稳定性还是很重要的。  
    其实,早在《多线程数据互斥》这篇博客中,我们就已经介绍过原子锁。本篇博客主要讨论的就是原子锁怎么使用。中间的一些用法只是我个人的一些经验,希望能够抛砖引玉,多听听大家的想法。

    (1)查找函数中原子锁   
    在一些函数当中,有的时候我们需要对满足某种特性的数据进行查找。在传统的单核CPU上,优化的空间比较有限。但是,现在多核CPU已经成了主流配置。所以我们完全可以把这些查找工作分成几个子函数分在几个核上面并行运算。但是,这中间就会涉及到一个问题,那就是对公共数据的访问。传统的访问方式,应该是这样的,
  1. [cpp] view plaincopyprint?unsigned int count = 0;   
  2.    
  3. int find_data_process()   
  4. {   
  5.     if(/* data meets our standards */){   
  6.          EnterCriticalSection(&cs);   
  7.          count ++;   
  8.          LeaveCriticalSection(&cs);            
  9.     }   
  10. }  
复制代码
我们看到代码中间使用到了锁,那么势必会涉及到系统调用和函数调度。所以,在执行效率上会大打折扣。那么如果使用原子锁呢?
  1. [cpp] view plaincopyprint?unsigned int count = 0;   
  2.    
  3. int find_data_process()   
  4. {   
  5.     if(/* data meets our standards */){   
  6.         InterLockedIncrement(&count);   
  7.     }   
  8. }  
复制代码
有兴趣的朋友可以做这样一道题目,查看0~0xFFFFFFFF上有多少数可以被3整除?大家也可以验证一下用原子锁代替临界区之后,代码的效率究竟可以提高多少。关于多核多线程的编程,朋友们可以参考《多线程基础篇》这篇博客。


    (2)代码段中的原子锁
    上面的范例只是介绍了统计功能中的原子锁。那么怎么用原子锁代替传统的系统锁呢?比如说,假设原来的数据访问是这样的,
  1. [cpp] view plaincopyprint?void data_process()   
  2. {   
  3.     EnterCriticalSection(&cs);   
  4.     do_something();   
  5.     LeaveCriticalSection(&cs);      
  6. }  
复制代码
如果改成原子锁呢,会是什么样的呢?
  1. [cpp] view plaincopyprint?unsigned int lock = 0;   
  2.    
  3. void data_process()   
  4. {   
  5.     while(1 == InterLockedCompareExchange(&lock, 1, 0));   
  6.     do_something();   
  7.     lock = 0;      
  8. }  
复制代码
这里用原子锁代替普通的系统锁,完成的功能其实是一样的。那么这中间有什么区别呢?其实,关键要看do_something要执行多久。打个比方来说,现在我们去买包子,但是买包子的人很多。那怎么办呢?有两个选择,如果卖包子的人手脚麻利,服务一个顾客只要10秒钟,那么即使前面排队的有50个人,我们只要等7、8分钟就可以,这点等的时间还是值得的;但是如果不幸这个卖包子的老板服务一个顾客要1分钟,那就悲催了,假使前面有50个人,那我们就要等50多分钟了。50分钟对我们来说可是不短的一个时间,我们完全可以利用这个时间去买点水果,交交水电费什么的,过了这个时间点再来买包子也不迟。

    和上面的例子一样,忙等的方法就是原子锁,过一会再来的方法就是哪个传统的系统锁。用哪个,就看这个do_something的时间值不值得我们等待了。


结帖率:61% (35/57)
发表于 2012-7-11 06:17:20 | 显示全部楼层   海南省乐东黎族自治县
{:3_232:}{:3_232:}{:3_232:}{:3_232:}我来抢沙发。。。
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)
发表于 2013-4-7 23:28:00 | 显示全部楼层   四川省成都市
我来抢地板
回复 支持 反对

使用道具 举报

发表于 2013-4-17 16:21:32 | 显示全部楼层   湖北省恩施土家族苗族自治州
我来没看懂
回复 支持 反对

使用道具 举报

结帖率:92% (12/13)
发表于 2015-12-24 23:09:23 | 显示全部楼层   广东省江门市
虽然不懂,但看起来很厉害 的样子
回复 支持 反对

使用道具 举报

发表于 2017-12-14 12:16:58 | 显示全部楼层   广东省江门市
虽然不懂,但看起来很厉害 的样子
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 23 天

发表于 2018-11-23 09:18:31 | 显示全部楼层   内蒙古自治区呼和浩特市
感谢分享,我来挖个坟
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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