使用信号量主要一个信号量句柄是下面四个函数:
HANDLE g_hSem = NULL;
g_hSem = CreateSemaphore(NULL, 2, 0x4, L"Test Sem");
WaitForSingleObject(g_hSem, INFINITE);//INFINITE为一直等待,不设置等待超时
ReleaseSemaphore(g_hSem, 1, NULL);
CloseHandle(g_hSem);
示例:
// Semaphore.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include "stdio.h"
HANDLE g_hSem = NULL;
unsigned __stdcall thread1(void *lparam);
int main()
{
/*
* 1、第二个参数需要>=0,但是为0时不会有信号,该参数指定一开始有多少个信号可用。
* eg:有的时候需要先写再读,所以在写之前这个参数设置为0,读的时候发现为0所以
* WaitForSingleObject(g_hSem, INFINITE)会等待有信号。
* 调用写完过后通过ReleaseSemaphore(g_hSem, 1, NULL)使它加1,则可以读,此时WaitForSingleObject就不在等待。
* 2、跨线程、进程会使用到第四个名字参数,其它使用该信号量的process通过OpenSemaphore来打开该信号量。
*/
g_hSem = CreateSemaphore(NULL, 2, 0x4, L"Test Sem");//一开始只有两个,所以只会执行前两个线程,前两个线程中如果不通过ReleaseSemaphore(g_hSem, 1, NULL)来增加信号,则不会开启第三个线程。
UINT iThreadId = 0;
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
_beginthreadex(NULL, 0, thread1, NULL, 0, &iThreadId);
getchar();
if (g_hSem)
{
CloseHandle(g_hSem);
}
return 0;
}
void useSemaphpre() {
WaitForSingleObject(g_hSem, INFINITE);//INFINITE为一直等待,不设置等待超时
printf("正在使用semaphore");
ReleaseSemaphore(g_hSem, 1, NULL);
}
unsigned __stdcall thread1(void *lparam)
{
useSemaphpre();
return 0;
}