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正在等待\n", *pint);
19             if (WaitForSingleObject(myhsem, INFINITE) == WAIT_OBJECT_0)
20             {
21                 printf("boy%d得到信号\n", *pint);
22                 Sleep(3000);
23                 printf("boy%d释放信号\n", *pint);
24 
25                 //ReleaseSemaphore(myhsem, 1, NULL);
26                 CloseHandle(myhsem);
27             }
28         }
29         else
30         {
31             printf("信号量获取失败\n");
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 }

 

posted @ 2018-02-03 13:03  喵小喵~  阅读(266)  评论(0编辑  收藏  举报