由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问达人一个shared memory 的问题
相关主题
Volatile variables do not provide any atomicity (转载)也谈OOP跟FP之争
C++ storage classes and qualifiers对 (im)mutability 的误解和深度理解
clojure和common lisp区别大么,语法上。go也是三种paradigm混合的语言
clojure高手请进fread/fwrite有big/small endian问题吗?
关于signal handler请教一个C的问题
关于线程读写全局变量的问题一道面试题
用volatile退出线程对不对?(C++)C问题,被64bit iPhone搞晕了
Bihai,你就用atmoic完事了大侠们说说C(C++)或Fortran比较Matlab到底优点在哪儿?
相关话题的讨论汇总
话题: process话题: memory话题: lock话题: update话题: atomic
进入Programming版参与讨论
1 (共1页)
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,不需要自己写。
1 (共1页)
进入Programming版参与讨论
相关主题
大侠们说说C(C++)或Fortran比较Matlab到底优点在哪儿?关于signal handler
inline C function in VC++ 2005 express关于线程读写全局变量的问题
(zz)C++11新特性用volatile退出线程对不对?(C++)
关于python的优势Bihai,你就用atmoic完事了
Volatile variables do not provide any atomicity (转载)也谈OOP跟FP之争
C++ storage classes and qualifiers对 (im)mutability 的误解和深度理解
clojure和common lisp区别大么,语法上。go也是三种paradigm混合的语言
clojure高手请进fread/fwrite有big/small endian问题吗?
相关话题的讨论汇总
话题: process话题: memory话题: lock话题: update话题: atomic