线程同步(windows平台):信号量

Posted woniu201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程同步(windows平台):信号量相关的知识,希望对你有一定的参考价值。

一:介绍

信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。

信号量遵循规则:
1.当前资源计数大于0,信号量有效。
2.当前资源计数等于0,信号量无效。
3.系统不允许当前资源数量为负。
4.当前资源数量不能大于最大资源数量。

二:函数说明

创建信号量:
    HANDLE   CreateSemaphore( 
        LPSECURITY ATTRIBUTES   lpSemaphoreAttributes,     //安全属性 
        LONG   lInitialCount,                                     //信号量对象的初始值该值必须大于等于0,小于等于lMaximumCount。大于0时,信号量被唤醒。 当释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore()时,按其指定的数量加一个值。
        LONG   lMaximumCount,                             //信号量的最大值,必须大于0
        LPCTSTR   lpName                                       //信号量名 
    )
    
获得信号量对象:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    )

释放信号量:
    BOOL  ReleaseSemaphore(
        HANDLE  hSemaphore,            //信号量句柄
        LONG      lReleaseCount,         //增加个数,大于0,小于信号量最大值
        LPLONG  lpPreviousCount     //可以用来传出先前的资源计数,设为NULL表示不需要传出
    )

三:代码实现

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t13
 4 Author:            woniu201
 5 Email:             [email protected]
 6 Created:           2018/10/24
 7 Description:    线程同步-信号量
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11  
12 using namespace std;
13  
14 volatile int number = 1;
15 HANDLE hSemaphore;
16  
17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
18 {
19     while (1)
20     {
21         WaitForSingleObject(hSemaphore, INFINITE);    //等待信号量
22         cout << "Thread1:" << number++ << endl;
23         ReleaseSemaphore(hSemaphore, 1, NULL);        //信号量的当前资源+1
24         if (number >= 1000)
25         {
26             break;
27         }
28         
29     }
30     return 0;
31 }
32  
33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
34 {
35     while (1)
36     {
37         WaitForSingleObject(hSemaphore, INFINITE);   //等待信号量
38         cout << "Thread2:" << number++ << endl;
39         ReleaseSemaphore(hSemaphore, 1, NULL);        //信号量的当前资源+1
40         if (number >= 1000)
41         {
42             break;
43         }
44     }
45     return 0;
46 }
47  
48  
49 int main()
50 {
51     //创建自动事件
52     hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
53  
54     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
55     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
56  
57     getchar();
58     return 1;
59 }

 






















以上是关于线程同步(windows平台):信号量的主要内容,如果未能解决你的问题,请参考以下文章

Windows线程同步

多线程编程之Windows同步方式

使用 Windows 中的事件同步线程

线程同步之信号量

C++多线程同步技巧--- 事件

线程资源同步——互斥量和条件变量