24.信号量

  • 创建信号量
    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 }
原文地址:https://www.cnblogs.com/xiaochi/p/8409207.html