首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++多线程-原子锁

C++多线程-原子锁

作者头像
cwl_java
发布2020-01-15 10:46:09
1.4K0
发布2020-01-15 10:46:09
举报
文章被收录于专栏:cwl_Javacwl_Java

原子锁是多线程编程中的一个特色。然而,在平时的软件编写中,原子锁的使用并不是很多。这其中原因很多,我想主要有两个方面。第一,关于原子锁这方面的内容介绍的比较少;第二,人们在编程上面习惯于已有的方案,如果没有特别的需求,不过贸然修改已存在的代码。毕竟对很多人来说,不求有功,但求无过。保持当前代码的稳定性还是很重要的。

其实,早在《多线程数据互斥》这篇博客中,我们就已经介绍过原子锁。本篇博客主要讨论的就是原子锁怎么使用。中间的一些用法只是我个人的一些经验,希望能够抛砖引玉,多听听大家的想法。

(1)查找函数中原子锁 在一些函数当中,有的时候我们需要对满足某种特性的数据进行查找。在传统的单核CPU上,优化的空间比较有限。但是,现在多核CPU已经成了主流配置。所以我们完全可以把这些查找工作分成几个子函数分在几个核上面并行运算。但是,这中间就会涉及到一个问题,那就是对公共数据的访问。传统的访问方式,应该是这样的,

unsigned int count = 0;  
  
int find_data_process()  
{  
    if(/* data meets our standards */){  
         EnterCriticalSection(&cs);  
         count ++;  
         LeaveCriticalSection(&cs);           
    }  
}  

我们看到代码中间使用到了锁,那么势必会涉及到系统调用和函数调度。所以,在执行效率上会大打折扣。那么如果使用原子锁呢?

unsigned int count = 0;  
  
int find_data_process()  
{  
    if(/* data meets our standards */){  
        InterLockedIncrement(&count);  
    }  
}  

(2)代码段中的原子锁 上面的范例只是介绍了统计功能中的原子锁。那么怎么用原子锁代替传统的系统锁呢?比如说,假设原来的数据访问是这样的,

void data_process()  
{  
    EnterCriticalSection(&cs);  
    do_something();  
    LeaveCriticalSection(&cs);     
} 

如果改成原子锁呢,会是什么样的呢?

unsigned int lock = 0;  
  
void data_process()  
{  
    while(1 == InterLockedCompareExchange(&lock, 1, 0));  
    do_something();  
    lock = 0;      
} 

这里用原子锁代替普通的系统锁,完成的功能其实是一样的。那么这中间有什么区别呢?其实,关键要看do_something要执行多久。打个比方来说,现在我们去买包子,但是买包子的人很多。那怎么办呢?有两个选择,如果卖包子的人手脚麻利,服务一个顾客只要10秒钟,那么即使前面排队的有50个人,我们只要等7、8分钟就可以,这点等的时间还是值得的;但是如果不幸这个卖包子的老板服务一个顾客要1分钟,那就悲催了,假使前面有50个人,那我们就要等50多分钟了。50分钟对我们来说可是不短的一个时间,我们完全可以利用这个时间去买点水果,交交水电费什么的,过了这个时间点再来买包子也不迟。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档