Chinaunix

标题: 请教原子操作应用场景 [打印本页]

作者: VIP_fuck    时间: 2016-10-20 22:55
标题: 请教原子操作应用场景
RT

我从来没在项目中用过原子操作,原子操作有什么应用场景?跟互斥锁相比,有什么优势?有什么劣势?

大牛指教。
作者: shang2010    时间: 2016-10-20 23:21
所谓原子操作,就是上厕所蹲坑
比喻不太好,所谓锁的操作就跟厕所的门一样,有人喜欢蹲坑时间长,有人喜欢蹲坑时间短,


所谓原子操作,就是一个人上厕所不会被打断一样,毕竟上厕所的事情,还是讲究的一个清静,对吧??。
作者: VIP_fuck    时间: 2016-10-21 08:27
回复 2# shang2010

“应用场景”,我说的是应用场景,不是概念。
作者: lxyscls    时间: 2016-10-21 09:21
本帖最后由 lxyscls 于 2016-10-21 09:27 编辑
VIP_fuck 发表于 2016-10-21 08:27
回复 2# shang2010

“应用场景”,我说的是应用场景,不是概念。

多线程counter计数,64bit修改

以上只限于atomic<>,cas个人觉得也算是原子操纵,这个就海了去了

Atomic vs. Non-Atomic Operations





作者: VIP_fuck    时间: 2016-10-21 09:24
回复 4# lxyscls

多谢,还有别的吗?
c++11的原子操作可是比较复杂的,应该不只是计数这么单一。

作者: lxyscls    时间: 2016-10-21 09:28
回复 5# VIP_fuck

您回的太快,请看我的更新
还有Class Instance原子更新,这个Java有

作者: VIP_fuck    时间: 2016-10-21 10:24
回复 6# lxyscls

good boy
作者: shang2010    时间: 2016-10-22 01:51
本帖最后由 shang2010 于 2016-10-22 01:56 编辑

回复 3# VIP_fuck

拜托你有点想象力好不好,类似的场景太多了,只要是多进程线程会多同一个坑拉屎读写数据,都有必要执行原子操作。


最经典的场景,网络服务,server layer逻辑完成后可能会对数据池添加数据,而net layer总是会从数据池取数据然后发送给client
这个逻辑或许不够深入,假如net有网络小问题,有些错误数据就需要重复发送(这时候代码底层的data计数器标识什么指针的,全部不能被意外修改变化)


同样客户端也有问题,如果接受的数据网络问题导致误差,checksum出了问题,net-worker一定要加锁拒绝其他线程访问的,



你代码写多了就会理解了,全是在拉屎,
fuck the shit code


作者: shang2010    时间: 2016-10-22 01:55
本帖最后由 shang2010 于 2016-10-22 01:57 编辑

多个进程访问数据库,也是最经典的场景



概念理清了,写代码才有乐趣,不然不适合做这行
作者: VIP_fuck    时间: 2016-10-22 08:40
回复 8# shang2010

最讨厌你这种动不动装逼说教的
你能不能看懂中国文字?看清帖子标题:应用场景。

我说的是场景,场景,场景。

懂不懂什么是场景?

概念理清。。。

你 TM 脑子有泡

作者: shang2010    时间: 2016-10-22 10:03
楼上又来拉屎了
作者: shang2010    时间: 2016-10-22 10:09
本帖最后由 shang2010 于 2016-10-22 10:13 编辑

概念理解好了,就不应该有这么多问题。技术是一门很严谨的工程性实践性的学科,不是凭空想象的,或者抽血的哲学问题
任何一个概念,都是一个经典的场景。。不跟你谈生活中的拉屎了,反正又不要我写代码

作者: codechurch    时间: 2016-10-25 18:01
回复 1# VIP_fuck

原子操作,除了引用计数、统计读写字节数等计数操作外,一个重要的应用场景就是:   

   在短停顿并发并行垃圾收集系统里,在短停顿的时候,要求所有使用了“垃圾收集堆”的线程在检查“安全点”时挂起。

   “安全点检查”是所有使用了“垃圾收集堆”的线程的一个非常频繁的操作,所以,无法接受mutex之类的操作,这个时候用原子操作就节约了大量的性能。

   我们只需在“安全点检查”时,对一个原子变量做inc操作,对返回值进行判断,看它是否最高位为1 。如果为 1, 说明 “检查”到 垃圾收集器 的挂起命令,要求本线程挂起。
   接着,对原子变量做dec操作,然后本线程等待一个事件,将自己挂起。
   如果最高位不是1,则进行堆对象的相关操作,操作后,对原子变量进行dec操作。

   而,堆的短停顿的线程,如果决定进行短停顿,则将原子变量的最高位设置为1,然后自旋等待原子变量的除最高位之外都为0。之后,进行短停顿内的操作,此时,所有之前操作堆对象的线程都不再操作对象,且要操作对象的线程都挂起在事件上;操作后,将最高位设0,造事件。


   那么,在绝大多数时候,每个线程在安全点检查时,只耗费了一个原子inc操作,代价很低,比原子比较交换也低很多。

作者: lxyscls    时间: 2016-10-26 04:40
回复 1# VIP_fuck

ATOMIC OPERATIONS

https://www.mjmwired.net/kernel/Documentation/memory-barriers.txt


作者: VIP_fuck    时间: 2016-10-26 08:46
回复 14# lxyscls

非常感谢,这是我需要的。
作者: VIP_fuck    时间: 2016-10-26 08:50
回复 12# shang2010

行行行,你技术牛逼,我服。
我服你,你严谨,你技术好,你不凭空想象,你经典场景,你懂概念,宇宙你是万能的。

我服你!!!!我服你!!!!! 我服你!!!!

tips:
建议,回去跟语文老师好好学学,什么叫“概念”,什么叫“应用场景”。

作者: VIP_fuck    时间: 2016-10-26 08:50
回复 13# codechurch

感谢
作者: mr_sev    时间: 2016-11-04 17:42
回复 16# VIP_fuck


哈哈!            




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2