信号量对象

【勇芳软件工作室】汉化HomePreviousNext

A 【信号量对象】是一个同步对象,它保持零和指定的最大值之间的计数。每次线程完成对信号量对象的等待时,计数递减,并且每次线程释放信号量时都会递增计数。当计数达到零时,没有更多的线程可以成功地等待信号量对象状态变为信号。信号量的状态设置为在其计数大于零时发出信号,并且当其计数为零时,信号量的状态为非信号。

信号量对象可用于控制可以支持有限数量用户的共享资源。它用作将共享资源的线程数限制为指定的最大数量的门。例如,应用程序可能会对其创建的窗口数量设置限制。它使用最大计数等于窗口限制的信号量,每当窗口创建时递减计数,并在窗口关闭时递增计数。应用程序在创建每个窗口之前指定调用其中一个等待功能的信号量对象。当计数为零__表示已经达到窗口限制__等待功能阻止窗口创建代码的执行。

线程使用CreateSemaphore函数创建信号量对象。创建线程指定对象的初始计数和计数的最大值。初始计数必须不小于零,也不得大于最大值。创建线程还可以指定信号量对象的名称。其他进程中的线程可以通过在对OpenSemaphore函数的调用中指定其名称来打开现有信号量对象的句柄。有关互斥量,事件,信号量和计时器对象的名称的其他信息,请参阅进程间同步.

每次等待功能中的一个返回,因为信号量的状态被设置为发出信号,信号量的计数将减少1。ReleaseSemaphore函数将信号量的计数增加一定量。计数永远不能小于零或大于最大值。

信号量的初始计数通常设置为最大值。随着受保护资源的消耗,计数从那个级别减少。或者,您可以创建一个初始计数为零的信号量,以在应用程序初始化时阻止对受保护资源的访问。初始化后,您可以使用ReleaseSemaphore将计数增加到最大值。

线程不会获得与互斥对象一样的信号量对象的所有权。拥有互斥体对象的线程可以重复等待同一个互斥对象变为信号,而不会执行其阻塞。然而,在等待操作完成时,重复等待相同信号量对象的线程会减少信号量的计数;当计数到零时线程被阻塞。类似地,只有拥有互斥体的线程可以成功调用ReleaseMutex函数,尽管任何线程都可以使用ReleaseSemaphore来增加信号量对象的计数。

一个线程可以通过在调用任何等待功能的方法中重复指定相同的信号量对象来多次减少信号量的计数。但是,使用包含同一信号量的多个句柄的数组调用多对象等待函数之一不会导致多个递减。