在RISC中,定义一个全局的char变量a,两个线程,一个线程对该变量进行读,一个线程对该变量进行写
char a = 0;
/* thread 0*/
extern char a;
void thread0()
{
if (a == 0) { /* load */
printf("a = %d\n", a);
}
}
/* thread 1 */
extern char a;
void thread0()
{
volatile int status;
status = get_device_status(); /* 读取设备状态 */
a = status ; /* store */
}
在这个例子中,线程0只关心a的值,线程1只负责写a的值,线程1并不关心a的当前值
从汇编的角度来看,读和写都只需要一条store和load指令便可以完成,store和load是原子操作,因此可以保证操作的完整性,所以我觉得可以不用加锁,不知道这样理解是否正确?
------解决方案--------------------
使用互斥是比较保险的做法.
如果不加互斥,使用volatile,或者指针操作指向a,有不同步的问题.
假定某个时刻,读的线程读取a的值放入寄存器了,这个时候写线程运行,
改写a的值,但是读线程返回的值与a的当前值就不一致了.
说明一下:volatile保证读写不被优化,防止使用寄存器操作替代内存操作,
但是不能解决操作的原子性问题.