信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
在Windows中用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。
线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。
下面是一个使用Semaphore信号量的例子:
HANDLE
gSamephore;
char
gArray[256];
void InitializeArray()
{
for(int i = 0;i<256;i++)
{
gArray[i] = ‘I’;
}
}
UINT ThreadProc1(LPVOID pParam)
{
WaitForSingleObject(gSemaphore,
INFINITE);
for(int i = 0;i<256;i++)
{
global_Array[i]=’O’;
Sleep(10);
}
ReleaseSemaphore(gSemaphore, 1,
NULL);
return 0;
}
UINT ThreadProc2(LPVOID pParam)
{
WaitForSingleObject(gSemaphore,
INFINITE);
for(int i = 0;i<256;i++)
{
gArray[i]=’T’;
Sleep(10);
}
ReleaseSemaphore(gSemaphore, 1,
NULL);
return 0;
}
int main(int argc, char *argv[])
{
//设置信号量 2 个资源,同时只可以有两个线程访问
gSemaphore= CreateSemaphore(NULL,
2, 2, NULL);
hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
CloseHandle(gSemaphore);
}
Copyright 2011-2020 © MallocFree. All rights reserved.