有一个线程函数:
void FUN(...)
{
    while(bFlag)
    {
       ...
    }
}还有一个终止线程的函数:
void StopThread()
{
    bFlag = FALSE;
}我的问题:需要对bFlag变量进行加锁访问吗? 为什么?

解决方案 »

  1.   

    补充下:bFlag就只有在此两处访问
      

  2.   

    没必要,如果你觉得不放心,可以考虑用volatile int申明,
    然后用interlock系列函数访问即可。
      

  3.   

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