关于多线程访问安全性有关问题

关于多线程访问安全性问题
有一个线程函数:
void FUN(...)
{
  while(bFlag)
  {
  ...
  }
}

还有一个终止线程的函数:
void StopThread()
{
  bFlag = FALSE;
}

我的问题:需要对bFlag变量进行加锁访问吗? 为什么?

------解决方案--------------------
不需要
------解决方案--------------------
这个要看需求,如果是对这个控制的精度要求很精确的场合就要加锁,一般情况下就不用了
------解决方案--------------------
不用
访问控制是怕同时写发生错乱
你这个线程中只是读
所以没必要做控制
------解决方案--------------------
没必要,如果你觉得不放心,可以考虑用volatile int申明,
然后用interlock系列函数访问即可。
------解决方案--------------------
最好用原子操作。因为存在编译优化和多cache同步的问题。另外volatile 是一定要的。

编译优化:
如果没有volatile,你这个循环被编译器优化后可能变成这样:
void FUN(...)
{
if(bFlag)
{
J_Loop1:
...
goto J_Loop1;
}
}
因为编译器并不知道你的bFlag会被另一个线程修改。
如果在多处理器系统里,因为缓存是独立的,不像多核单处理器那样共享,假如你的两个线程被系统调度到不同的cpu上,那你修改的bFlag还是不会反映到FUN所在的线程。因为同一段内存地址反映在不同的线程的视图都不一样了