《win32多线程程序设计》中,有关ReleaseSemaphore()的用法,不太明白。如果任何线程都解除被任何线程锁定的 semaphore。那如果锁定线程没有使用完,会怎么样?与 mutex 不同的是,调用 ReleaseSemaphore() 的那个线程,并不一定就
得是调用 Wait...() 的那个线程。任何线程都可以在任何时间调用
ReleaseSemaphore(),解除被任何线程锁定的 semaphore。

解决方案 »

  1.   

    mutex就是资源最大量为1的信号量。
      

  2.   


    “任何线程都可以在任何时间调用ReleaseSemaphore(),解除被任何线程锁定的 semaphore。”不太明白。
    如果由其他线程解锁,其他线程如何知道锁定的线程什么时候使用完?
      

  3.   

    你可以这么理解。semaphore就像个发信器,一个信号是一个资源,release函数就是增加一个资源,然后wait函数就可以等到一个资源。这里没有“使用中”的概念,它仅表示“生产”——“消费”的模式,release生产一个资源,wait函数消费一个资源。
      

  4.   

    谢谢sinservice,请问一直使用release函数会一直生产资源吗?
      

  5.   


    你调用一次,就生产一个信号。但微软实现的semaphore有最大数量限制。semaphore可以用在队列上,可通知线程池去拿资源。
      

  6.   

    请问消费者能释放semaphore信号吗,如何释放?
      

  7.   


    如果消费者释放信号,他就不叫消费者了,他就是另外一个角色了。我们说semaphore像这种买卖关系,卖家卖一个信号,买家买一个信号。你问,“买家可以卖吗?”那就是另外一宗买卖了。
      

  8.   

    谢谢sinservice,大概明白了,能举个例子说明一下吗?
      

  9.   


    比如,你可以用semaphore做一个简单的消息队列。
    伪码:struct queue
    {
        mutex       lock;
        semaphore   sem;
        list        items;
    };void post( queue *q, item i ) 
    {
        wait_mutex(q->lock);
        list_push(q->items, i);    
        release_mutex(q->lock);    
     
        release_semaphore(q->sem, 1);
    }  item wait( queue *q ) 
    {
        item i;
        wait_semaphore(q->semaphore);    wait_mutex(q->lock);
        i = list_pop(q->items);    
        release_mutex(q->lock);      
       
        return i;    
    }这样,post函数是生产者,wait函数是消费者,他们可以分别处于不同的线程中,可以为多对多的关系。
      

  10.   

    非常感谢sinservice,终于明白信号量如何用了,原来是解决生产者—消费者的问题。