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