《win32多线程程序设计》中,有关ReleaseSemaphore()的用法,不太明白。如果任何线程都解除被任何线程锁定的 semaphore。那如果锁定线程没有使用完,会怎么样?与 mutex 不同的是,调用 ReleaseSemaphore() 的那个线程,并不一定就
得是调用 Wait...() 的那个线程。任何线程都可以在任何时间调用
ReleaseSemaphore(),解除被任何线程锁定的 semaphore。
得是调用 Wait...() 的那个线程。任何线程都可以在任何时间调用
ReleaseSemaphore(),解除被任何线程锁定的 semaphore。
“任何线程都可以在任何时间调用ReleaseSemaphore(),解除被任何线程锁定的 semaphore。”不太明白。
如果由其他线程解锁,其他线程如何知道锁定的线程什么时候使用完?
你调用一次,就生产一个信号。但微软实现的semaphore有最大数量限制。semaphore可以用在队列上,可通知线程池去拿资源。
如果消费者释放信号,他就不叫消费者了,他就是另外一个角色了。我们说semaphore像这种买卖关系,卖家卖一个信号,买家买一个信号。你问,“买家可以卖吗?”那就是另外一宗买卖了。
比如,你可以用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函数是消费者,他们可以分别处于不同的线程中,可以为多对多的关系。