当前位置: 代码迷 >> 驱动开发 >> 两个线程同时读写一个int是否需要互斥解决思路
  详细解决方案

两个线程同时读写一个int是否需要互斥解决思路

热度:84   发布时间:2016-04-28 10:56:26.0
两个线程同时读写一个int是否需要互斥
在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保证读写不被优化,防止使用寄存器操作替代内存操作,
但是不能解决操作的原子性问题.
  相关解决方案