本帖最后由 mwj1984 于 2009-08-06 22:05:08 编辑

解决方案 »

  1.   

    EnterCriticalSection会标明哪些全局变量是受保护的变量,当一个线程调用EnterCriticalSection时,在关键部位肯定是原子执行的,如果某个全局变量被标记(即在调用EnterCriticalSection后调用LeaveCriticalSection前)其他的任何线程都将会在EnterCriticalSection内部等待,直到那个标记线程调用LeaveCriticalSection除去标记为止。还有注意把主线程修正一下,主线程仅仅等待4s就返回,会导致整个进程返回,很难看到效果
      

  2.   

    等待 4s也可以看到运行结果。是不是LeaveCriticalSection其他关键代码段竞争临界区对象的所有权呀
      

  3.   

    临界区:
    EnterCriticalSection
    LeaveCriticalSection同一进程内(临界区只在进程内有效)的所有线程可以共享一个临界区对象(就是CRITICAL_SECTION 为类型定义的一个对象),当某个线程调用EnterCriticalSection成功而获得对该对象的所有权后(即通常讲的进入了临界区),所有其他的线程这时如果调用了EnterCriticalSection,那么线程将被阻塞在该API里面。然后如果原先获得临界区对象的所有权的线程调用LeaveCriticalSection而释放了临界区的所有权(即通常讲的离开临界区),那么之前因为调EnterCriticalSection而阻塞的线程将会有一个(而且只会有一个)线程醒来得到执行时间(也就是从EnterCriticalSection返回),这时候醒来的线程持有临界区对象的所有权,也就是进入了临界区,其他没有得到所有权的线程仍将继续保持阻塞在EnterCriticalSection之中,直到临界区对象被其持有者释放而使得等待临界区的线程有机会进入临界区。
      

  4.   

    若果有Sleep(4000)和sleep(1)时,各临界区获得临界区对象的所有权的模式是按 rulary(小星星)说的方式。但是如果去掉各个sleep(1)后各临界区获得临界区对象的所有权的模式又是怎样呢?是按时间片分配的吗?如果不是,又是怎样获得所有权的呢?我很疑惑