当前位置: 技术问答>linux和unix
共享内存及线程数据同步的问题。
来源: 互联网 发布时间:2016-03-20
本文导语: 麻烦高人解一下疑惑。 1.同享内存采用信号量进行内存数据的同步。请问是否在读共享内存的地方也要加信号量? 2.线程采用互斥锁进行数据的同步,假设只有主线程会写全局变量,其它线程只会读。请问是否需要...
麻烦高人解一下疑惑。
1.同享内存采用信号量进行内存数据的同步。请问是否在读共享内存的地方也要加信号量?
2.线程采用互斥锁进行数据的同步,假设只有主线程会写全局变量,其它线程只会读。请问是否需要加互斥锁?是否写与读的地方都要加?
1.同享内存采用信号量进行内存数据的同步。请问是否在读共享内存的地方也要加信号量?
2.线程采用互斥锁进行数据的同步,假设只有主线程会写全局变量,其它线程只会读。请问是否需要加互斥锁?是否写与读的地方都要加?
|
比如共享内存里的结构是:
struct {
int read_pos;
int write_pos;
data_t data[SZ_DATA];
} *pshared_data;
你可以在写完 pshared_data->data[write_pos]之后再write_pos++
这样在读共享内存时, pshared_data->data[pshared_data->write_pos-1]的数据肯定是完整的。
|
1.同享内存采用信号量进行内存数据的同步。请问是否在读共享内存的地方也要加信号量?
也可用互斥锁啊
2.线程采用互斥锁进行数据的同步,假设只有主线程会写全局变量,其它线程只会读。请问是否需要加互斥锁?是否写与读的地方都要加?
可以使用读写锁。
如果仅仅访问一个32位以内的全局变量,可以不用加锁。
也可用互斥锁啊
2.线程采用互斥锁进行数据的同步,假设只有主线程会写全局变量,其它线程只会读。请问是否需要加互斥锁?是否写与读的地方都要加?
可以使用读写锁。
如果仅仅访问一个32位以内的全局变量,可以不用加锁。
|
互斥锁本来就是保护数据的,即使确定只有一个修改,其他的只读也是不行的,因为你要保证你读的是否是修改后的数据。一般都要加
|
共享内存信号量是个全局,定义了之后哪里都是可见的。只要那个key对的,所操作的就是同一个sem