zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    迁移MSSQL实例的所有login(包含密码)
    某公司的存储过程模板(摘抄自高大神的博客)
    检测和终结死锁
    70-461学习笔记,关于几个日期函数
    Oracle-12541:TNS:无监听程序 .
    C#- 实用的Log4Net日志记录例子
    EASYUI- EASYUI左移右移 GRID中值
    MYSQL- 分页存储过程
    MSSQLSERVER数据库- 一条代码搞定单表备份表结构和表数据
    Delphi- 操作EXCEL
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/3386236.html
Copyright © 2011-2022 走看看