1.信号量创建函数CreateSemaphore(NULL,initialValue,maxValue,NULL)
该函数的返回值为指向信号量的句柄,之后通过该句柄来使用信号量;
该函数第一个参数为安全属性,一般情况下默认为NULL;
第二个参数为信号量的初始值;
第三个参数为信号量的最大值;
第四个参数为信号量名称,我是通过句柄来使用信号量的,因此名称都写成NULL;
为了简单起见,我没有用CreateMutex()函数来创建互斥锁,而是创建了初始值为1最大值也为1的信号量来替代,代码如下:HANDLE bMutex = CreateSemaphore(NULL,1,1,NULL);//创建对箱子互斥访问的锁;
普通信号量创建代码:
HANDLE bEmpty = CreateSemaphore(NULL,box1Size,box1Size,NULL);//创建空缓冲区的信号量句柄
HANDLE bFull = CreateSemaphore(NULL,0,box1Size,NULL);//创建满缓冲区的信号量的句柄
2.信号量使用函数DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
第一个参数为要使用的信号量的句柄,句柄由信号量创建函数得到;
第二个参数为判断信号量是否可使用的等待时间,单位为毫秒;
如果在等待时间内信号量变得可以使用,返回WAIT_OBJECT_0,如果等待时间到达上限信号量还是无法使用,则函数返回WAIT_TIMEOUT,可以根据两种情况下的不同的函数返回值来判断信号量是否可使用;
参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止;
但是在课设过程中老师说尽量不要使用INFINITE,而是使用一个确定的值来代替(如1000),再通过一个死循环来不停监测,这样做是因为会不停地监测信号量是否可用,如果此时结束正在执行这段代码的进程程序会报错&#