g*********e 发帖数: 14401 | 1 背景是用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不成问题。 |
v******y 发帖数: 84 | 2 这个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不成问题。
|
g*********e 发帖数: 14401 | 3
初衷就是不用lock 就一个int
【在 v******y 的大作中提到】 : 这个reader writer pattern不行吗? : 有reader的时候不能写 : 当reader=0 : 时候开始lock,进行写操作 : : 读。 : 是C
|
l*********s 发帖数: 5409 | 4 x86整数读写是原子操作,不加锁也行。但是std::atomic移植性好。 |
p*u 发帖数: 2454 | 5 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不成问题。
|
S*A 发帖数: 7142 | 6 这个要严格区分是简单读写还是 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移植性好。
|
S*A 发帖数: 7142 | 7
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
|
g*********e 发帖数: 14401 | 8 恩 你说的有理
【在 S*A 的大作中提到】 : : volatile 在你的 reader process 是需要的。 : 不然compiler 不知道那个地址的memory会自己被另外一个 : process update. 可能会 cache memory 里面的内容。 : volatile 告诉 compiler 每次读这个内存都要老老实实 : load,不要分配到寄存器。 : 不是 update to date 一定会发生的,因为是两个不同 : process。等你的 reader 读到这个数据,还没有来得及 : 进行判断的时候,这个数据就可能已经被另外 process : update 了。也就是说,你拿到的数据永远有可能是 outdate
|
w***x 发帖数: 105 | 9 问题虽然简单,但真正能把lock free说明白的人并不多,虽然很多人都说自己懂多线
程编程... |
g*****0 发帖数: 17 | 10 没实际用过。觉得用信号量之类做同步应该可行。pthread_barrier也可以考虑考虑。 |
l*********s 发帖数: 5409 | 11 学习!
【在 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 就可以了。
|
l*********s 发帖数: 5409 | 12 能用boost的话可以看interprocess和shared_memrory_object,不需要自己写。 |
b*******s 发帖数: 5216 | 13 yup, have to use offset rather than address
【在 l*********s 的大作中提到】 : 能用boost的话可以看interprocess和shared_memrory_object,不需要自己写。
|