• Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用


    <一>线程间同步原因

    1. 线程间竞争共享资源;
    2. 线程间为完成某个任务而协作;

          通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步。

          信号量很好地将互斥量和事件结合起来,同时解决竞争和协作问题。

          信号量的两个核心操作:提高计数值和降低计数值(Up 和 Down)。Down操作时检查信号量的计数值是否大于0,如果大于0,则信号量的计数值减1,线程继续运行;如果计数值为0,线程由于不能获得信号量而进入睡眠状态。这两个操作都是不可再分的操作。

    与信号量有关的函数:

    函数名 作用
    CreateSemaphore 创建一个信号量
    OpenSemaphore 打开一个已经创建的信号量
    ReleaseSemaphore 释放对信号量的所有权

     老规矩,看例子:

    #include <windows.h>
    #include <process.h> /* _beginthread, _endthread */
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    
    HANDLE hSemaphore;
    
    DWORD WINAPI myThread(LPVOID lpParam)
    {
        int* pNo = (int*)lpParam;
        WaitForSingleObject(hSemaphore,INFINITE);//等待信号量
    
        cout<<"*****Thread #"<<*pNo<<" Get the semaphore"<<endl;
        Sleep(1000*(*pNo));
    
        cout<<"*****Thread #"<<*pNo<<" release the semaphore"<<endl;
        ReleaseSemaphore(hSemaphore,1,NULL);//指定要信号量的计数值增加1
        return 1;
    }
    
    int main()
    {
        DWORD dw;
        hSemaphore = CreateSemaphore(NULL,3,3,NULL);//初始值为3,最大值也为3的信号量
        int t[6];
        for (int i=0;i<6;i++)
        {
            t[i]=i+1;
            CreateThread(NULL,0,myThread,t+i,0,&dw);
        }
        Sleep(60000);
        return 0;
    }
  • 相关阅读:
    leetcode 75 颜色分类 A
    leetcode525连续数组 A
    WCF无身份验证配置
    三读设计模式
    EntityFrameWork+Oracle学习笔记搭配环境(一)
    EntityFrameWork+Oracle学习笔记DBfirst(二)
    用Python解答百度测试开发算法面试题
    Python实现采集wordpress整站数据的爬虫
    吾八哥学Python(六):运算符与表达式
    吾八哥学Python(四):了解Python基础语法(下)
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/3386236.html
Copyright © 2020-2023  润新知