- 创建信号量
1 //创建信号对象并开辟一个信号,最大计数是5,并初始化有五个可以用 2 HANDLE hSEM = CreateSemaphoreW(NULL, 5, MAX, id);
- 关闭信号量
1 CloseHandle(hSEM);
- 根据Id打开一个信号量
1 //根据一个id打开一个信号 2 HANDLE myhsem = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, FALSE, id);
- 等待信号量,直到有可用空间
WaitForSingleObject(myhsem, INFINITE) == WAIT_OBJECT_0
- 释放信号量,使信号量可用数加1
1 ReleaseSemaphore(myhsem, 1, NULL); 2 //或者 3 //CloseHandle(myhsem);
完整代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <Windows.h> 4 5 #define id "xinhao" 6 #define MAX 5 7 8 DWORD WINAPI boy(void *p) 9 { 10 int *pint = p; 11 while (TRUE) 12 { 13 //根据一个id打开一个信号 14 HANDLE myhsem = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, FALSE, id); 15 //如果等到了信号 16 if (myhsem) 17 { 18 printf("boy%d正在等待 ", *pint); 19 if (WaitForSingleObject(myhsem, INFINITE) == WAIT_OBJECT_0) 20 { 21 printf("boy%d得到信号 ", *pint); 22 Sleep(3000); 23 printf("boy%d释放信号 ", *pint); 24 25 //ReleaseSemaphore(myhsem, 1, NULL); 26 CloseHandle(myhsem); 27 } 28 } 29 else 30 { 31 printf("信号量获取失败 "); 32 } 33 34 } 35 36 return 1; 37 } 38 39 void main() 40 { 41 //创建信号对象并开辟一个信号,最大计数是5,并初始化有五个可以用 42 HANDLE hSEM = CreateSemaphoreW(NULL, 5, MAX, id); 43 44 45 46 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 47 HANDLE hd[10] = { 0 }; 48 for (int i = 0; i < 10; i++) 49 { 50 hd[i] = CreateThread(NULL, 0, boy, a + i, 0, NULL); 51 } 52 53 WaitForMultipleObjects(10, hd, TRUE, INFINITE); 54 CloseHandle(hSEM); 55 56 system("pause"); 57 }