Redian新闻
>
问达人一个shared memory 的问题
avatar
问达人一个shared memory 的问题# Programming - 葵花宝典
y*e
1
Pentax-Discuss Mail List世界各地爱好者自己组织出版的2008-2009作品集上市了,所有收
入捐给儿童癌症研究,和俺们地震赈灾差不多的性质。可惜自己没有能参参加。
虽说Pentaxian是小众,但是一个非常温暖的圈子。
作品集预览:
http://www.blurb.com/books/573542
购买:
http://www.blurb.com/bookstore/detail/573542
The best photography from the Pentax-Discuss Mail List, with all net profits
donated to the National Childhood Cancer Foundation.
Featured in The Online Photographer http://theonlinephotographer.typepad.com/the_online_photographer/2009/02/pentax-photographers-have-more-fun.html, this b
avatar
g*e
2
背景是用mmap 在多个process里分享一个chunk,只有一个process会写,其余的只会读。
写得process只往里面update integer (uint64, uint32, 这种)
问题:如果想保证每次写int都是atomic operation的话,写该怎么处理。编程语言是C
++ 11.
std::atomic 可以用吗?
volatile 或者mutable 呢?是不是对性能有影响。
直接写的话似乎也没问题,就是读得process可能拿到的数据不是update to date.
PS:这些int都是memory align的,所以alignment不成问题。
avatar
v*y
3
这个reader writer pattern不行吗?
有reader的时候不能写
当reader=0
时候开始lock,进行写操作

读。
是C

【在 g*********e 的大作中提到】
: 背景是用mmap 在多个process里分享一个chunk,只有一个process会写,其余的只会读。
: 写得process只往里面update integer (uint64, uint32, 这种)
: 问题:如果想保证每次写int都是atomic operation的话,写该怎么处理。编程语言是C
: ++ 11.
: std::atomic 可以用吗?
: volatile 或者mutable 呢?是不是对性能有影响。
: 直接写的话似乎也没问题,就是读得process可能拿到的数据不是update to date.
: PS:这些int都是memory align的,所以alignment不成问题。

avatar
g*e
4

初衷就是不用lock 就一个int

【在 v******y 的大作中提到】
: 这个reader writer pattern不行吗?
: 有reader的时候不能写
: 当reader=0
: 时候开始lock,进行写操作
:
: 读。
: 是C

avatar
l*s
5
x86整数读写是原子操作,不加锁也行。但是std::atomic移植性好。
avatar
p*u
6
std::memory_order_release

读。
是C

【在 g*********e 的大作中提到】
: 背景是用mmap 在多个process里分享一个chunk,只有一个process会写,其余的只会读。
: 写得process只往里面update integer (uint64, uint32, 这种)
: 问题:如果想保证每次写int都是atomic operation的话,写该怎么处理。编程语言是C
: ++ 11.
: std::atomic 可以用吗?
: volatile 或者mutable 呢?是不是对性能有影响。
: 直接写的话似乎也没问题,就是读得process可能拿到的数据不是update to date.
: PS:这些int都是memory align的,所以alignment不成问题。

avatar
S*A
7
这个要严格区分是简单读写还是 read,modify,write。
如果是 read,modify,write 还是要 lock prefix 的。
例如 mem->counter++; 这种,没有 lock prefix 就
不是 atomic 的。lock prefix 我指的是 asm 里面的
lock 指令。
x86 不加 lock prefix,只能保证 align 的 int
写是完整的,不会被别人读到 update 前面2个byte
后面2个byte没有 update 的情况。
因为 LZ 只有一个writer,所以其实不需要 atomic write
back。直接操作 aligned int 就可以了。

【在 l*********s 的大作中提到】
: x86整数读写是原子操作,不加锁也行。但是std::atomic移植性好。
avatar
S*A
8

volatile 在你的 reader process 是需要的。
不然compiler 不知道那个地址的memory会自己被另外一个
process update. 可能会 cache memory 里面的内容。
volatile 告诉 compiler 每次读这个内存都要老老实实
load,不要分配到寄存器。
不是 update to date 一定会发生的,因为是两个不同
process。等你的 reader 读到这个数据,还没有来得及
进行判断的时候,这个数据就可能已经被另外 process
update 了。也就是说,你拿到的数据永远有可能是 outdate
的。除非你在 reader process 上面 lock critical
section。
这个 race condition 一定会有,你的程序要可以对付。

【在 g*********e 的大作中提到】
:
: 初衷就是不用lock 就一个int

avatar
g*e
9
恩 你说的有理

【在 S*A 的大作中提到】
:
: volatile 在你的 reader process 是需要的。
: 不然compiler 不知道那个地址的memory会自己被另外一个
: process update. 可能会 cache memory 里面的内容。
: volatile 告诉 compiler 每次读这个内存都要老老实实
: load,不要分配到寄存器。
: 不是 update to date 一定会发生的,因为是两个不同
: process。等你的 reader 读到这个数据,还没有来得及
: 进行判断的时候,这个数据就可能已经被另外 process
: update 了。也就是说,你拿到的数据永远有可能是 outdate

avatar
w*x
10
问题虽然简单,但真正能把lock free说明白的人并不多,虽然很多人都说自己懂多线
程编程...
avatar
g*0
11
没实际用过。觉得用信号量之类做同步应该可行。pthread_barrier也可以考虑考虑。
avatar
l*s
12
学习!

【在 S*A 的大作中提到】
: 这个要严格区分是简单读写还是 read,modify,write。
: 如果是 read,modify,write 还是要 lock prefix 的。
: 例如 mem->counter++; 这种,没有 lock prefix 就
: 不是 atomic 的。lock prefix 我指的是 asm 里面的
: lock 指令。
: x86 不加 lock prefix,只能保证 align 的 int
: 写是完整的,不会被别人读到 update 前面2个byte
: 后面2个byte没有 update 的情况。
: 因为 LZ 只有一个writer,所以其实不需要 atomic write
: back。直接操作 aligned int 就可以了。

avatar
l*s
13
能用boost的话可以看interprocess和shared_memrory_object,不需要自己写。
avatar
b*s
14
yup, have to use offset rather than address

【在 l*********s 的大作中提到】
: 能用boost的话可以看interprocess和shared_memrory_object,不需要自己写。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。