转贴一段
信号量核心对象用于资源计数。它为线程提供了查询可用资源数目的能力;如果有一个或多个资源可用,可用资源就减1。信号量自动进行测试和设置操作。也就是说,当你从一个信号量请求资源时,操作系统将检查该资源是否可用,并将其计数减1,在此期间任何别的线程都不能打扰。只有在资源计数减1后,系统才会让别的线程访问此资源。
例如:假如一个计算机有3个串口,那么在任何给定的时间内不能有超过3个的线程去访问串口。这时就可以使用信号量。当信号量的访问计数大于0时它是有信号的,而当它等于0时是无信号的。每当线程调用WaitForSingleObject并传入信号量的句柄,系统将检查此信号量的引用计数是否大于0。如果是,系统将引用计数减1并唤醒此线程;若引用计数是0,系统使线程进入睡眠,直到另一个线程释放了此信号量。
由于若干个线程能够运行信号量的资源计数,所以和互斥量和临界区不同,信号量不被认为是由任何线程拥有的。
1、 创建信号量
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName );
此函数创建一个引用计数最大是lMaximumCount的信号量。LInitialCount指定信号量的初始引用计数。LpName指定引用计数的名字。通过它可以在进程中调用CreateSemaphore或OpenSemaphore时使用这个名字以得到此信号量的句柄:HANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName name );
2、 释放信号量
释放信号量是通过:
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
任何线程都可以在任何时刻调用此函数,因为信号量不被任何线程所拥有。ReleaseSemaphore可以通过lReleaseCount参数指定一次把信号量释放多少。最后一个参数pPreviousCount是一个长整数指针,在把lReleaseCount加到引用计数前,ReleaseSemaphore先将引用计数的值填入此参数中。
3、关闭信号量
关闭信号量使用CloseHandle。