信号量Semaphore
VC声明
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, // SD
LONGlInitialCount, // initial count
LONGlMaximumCount, // maximum count
LPCTSTRlpName// object name
);
作用:创建一个新的信号量
返回值
Long,如执行成功,返回信号量对象的句柄;零表示出错。会设置GetLastError。即使返回一个有效的句柄,但倘若它指出同名的一个信号量已经存在,那么GetLastError也会返回ERROR_ALREADY_EXISTS
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, // SD
LONGlInitialCount, // initial count
LONGlMaximumCount, // maximum count
LPCTSTRlpName// object name
);
作用:创建一个新的信号量
返回值
Long,如执行成功,返回信号量对象的句柄;零表示出错。会设置GetLastError。即使返回一个有效的句柄,但倘若它指出同名的一个信号量已经存在,那么GetLastError也会返回ERROR_ALREADY_EXISTS
参数
lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了信号量的安全特性
lInitialCount Long,设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
lMaximumCount Long,设置信号量的最大计数
lpName String,指定信号量对象的名称。用vbNullString可创建一个未命名的信号量对象。如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符
lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了信号量的安全特性
lInitialCount Long,设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
lMaximumCount Long,设置信号量的最大计数
lpName String,指定信号量对象的名称。用vbNullString可创建一个未命名的信号量对象。如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符
下面举个例子
hSemah1 =CreateSemaphore(0,1,1,_T("Test")); //创建信号量,初始值为1(发出信号),最多一个线程可用,信号量名字Test
hSemah2 =CreateSemaphore(0,0,1,_T("Test")); //创建信号量,初始值为0(不能发出信号),最多一个线程可用,信号量名字Test
//创建两个线程
HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,this,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,this,0,NULL);
hSemah2 =CreateSemaphore(0,0,1,_T("Test")); //创建信号量,初始值为0(不能发出信号),最多一个线程可用,信号量名字Test
//创建两个线程
HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,this,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,this,0,NULL);
DWORD CTest_SemaphoreDlg::Thread1(LPVOID lparam)
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;
while(1)
{
WaitForSingleObject(pDlg->hSemah1,INFINITE);
TRACE(_T("%d\n"),1);
ReleaseSemaphore(pDlg->hSemah1,1,NULL);
}
return 0;
}
DWORD CTest_SemaphoreDlg::Thread2(LPVOID lparam)
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;
while(1)
{
WaitForSingleObject(pDlg->hSemah2,INFINITE);
TRACE(_T("%d\n"),2);
ReleaseSemaphore(pDlg->hSemah2,1,NULL);
}
return 0;
}
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;
while(1)
{
WaitForSingleObject(pDlg->hSemah1,INFINITE);
TRACE(_T("%d\n"),1);
ReleaseSemaphore(pDlg->hSemah1,1,NULL);
}
return 0;
}
DWORD CTest_SemaphoreDlg::Thread2(LPVOID lparam)
{
CTest_SemaphoreDlg *pDlg = (CTest_SemaphoreDlg*)lparam;
while(1)
{
WaitForSingleObject(pDlg->hSemah2,INFINITE);
TRACE(_T("%d\n"),2);
ReleaseSemaphore(pDlg->hSemah2,1,NULL);
}
return 0;
}
程序执行的时候线程1中等待的信号量hSemah1初始值为1,触发wait,执行完成后ReleaseSemaphore会把hSemah1重新置为1,这样线程2就有了执行的机会,因为hSemah1,hSemah2为同名信号量指向的是同一信号量。