自动重置  也就是1个线程拿到了,其他线程就拿不到了  这样就只有一个可调度线程
可以打个比方2家商店 A  B,A有很多棒棒糖n个,B只有1个棒棒糖也就是A是手动,B是自动A店前面排了很多人,也就是1个1个都能买到棒棒糖,也就是多个线程有机会执行B店前面也排了很多人,而只有第一个人能买到棒棒糖,而这个人是不确定的,得看系统的调度,所以第一个人拿了以后,其他人就没有机会了买到棒棒糖了,也就是没有执行的机会了...哈哈  不知道说的恰当不

解决方案 »

  1.   

    《Windows核心编程》读百遍,多线程义自现。
      

  2.   

    可调度,就是指,这个线程在内核看来是活跃的,而不是等待事件的状态。内核的实现非常简单:伪代码BOOL
    KeSetEvent( struct event_object *event, BOOL f )
    {
           //// 此处是内核态,上下文保证不用加锁
           event->signal = f;
     
           if(f  && ! list_empty(&event->wait_threads) ) {
                 ///  有线程等待这个event
                if( event->isManualReset ) { 
                        /// 遍历所有等待的线程,唤醒
                        while( event->wait_threads.next != &event->wait_threads ) {
                               struct thread_object *thd;
                                thd = container_of( event->wait_threads.next,  struct thread_object , list );
                               list_erase(&thd->list); 
                                KeThreadWakeup( thd );
                       }
                }   else {
                      struct thread_object *thd;
                      /// 取出第一个线程唤醒
                       thd = container_of( event->wait_threads.next,  struct thread_object , list );
                      list_erase(&thd->list); 
                      KeThreadWakeup( thd );
                      event->signal = FALSE;   /// 信号自动复位  
                }
           }
           return TRUE;
    }