用法倒正确,不过 Return x有必要上锁吗。
 
{
  cs.Lock();
  x = 1;
  cs.Unlock();
  return x;
}

解决方案 »

  1.   

    这样用是错误的,如果把return x上锁,那么  cs.Unlock(); 这句永远执行不到,也就是说无法开锁。实际上因为互斥量一般是用来保护全局资源的,因此x应当是全局变量,没有必要再作为返回值返回。
      

  2.   

    好像CCriticalSection有问题,我曾经用过,但有时还发现有死锁出现,加入调试信息后发现有时居然能够连续两次加锁成功(在两个不同的线程里,信不信有你)!估计可能是一个线程的加锁代码正在执行时,进程调度到了另一个线程的加锁代码,真是岂有此理!我建议用自己解决临界区问题,但有一点要注意,循环中Sleep的时间要选为随机数,否则也会出现连续加锁两次成功的问题。
      

  3.   

    CCriticalSection,CEvent等几个使用方法都差不多,只要在要控制同步的数据时把它Lock住,最保险的方法在判断Lock()的返回值,如果出错,再查找原因,然后在使用完后再Unlock(),这里也可以判断返回值是否成功。
      

  4.   

    小心使用CCriticalSection,在你的系统资源很少的时候,它很容易抛出异常。同一个线程中可以多次进入同一个临界区,注意解锁。注意同一个线程中不同的临界区之间的进入顺序,否则容易“死锁”或“饥饿”。