zoukankan      html  css  js  c++  java
  • 信号量

    一、关于信号量

    1、在信号量中有一个内置的计数值,用于对资源进行计数;同时它通过内置的互斥机制保证在有多个线程试图对计数值进行修改时,在任一时刻只有一个线程对计数值进行修改。

    2、信号量的两个核心操作是Up操作(提高计数值)和Down操作(降低计数值):

      1)Down操作:

         检查信号量的计数值是否大于零

         1》若大于零,信号量的计数值减一(即用掉了一个信号量计数了),线程继续运行;

         2》若等于零(也就是线程不能获得所需的信号量了),于是进入睡眠状态。

        Down操作的原子性保证了一旦一个线程对信号量的

    操作开始,其他线程就不能访问,知道操作完成或阻塞。

      2)Up操作

        用于线程释放对信号量的所有权,提高信号量的计数值。

        若有多个线程正睡眠在该信号量上,则其中一个被操作系统选中,并被允许调用Down操作,此时计数值仍为零。于是睡眠在该信号量上的少了一个。

    二、有关函数

    CreateSemaphore()   创建一个信号量

    OpenSemaphore()     打开一个已经创建的信号量

    ReleaseSemaphore()  释放对信号量的所有权

    #pragma once
    #include <windows.h>
    #include <process.h>
    #include <iostream>
    using namespace std;
    
    HANDLE hSemaphore;
    DWORD WINAPI MyThread(LPVOID lpParameter)
    {
        int *pNo=(int*)lpParameter;
        WaitForSingleObject(hSemaphore,INFINITE);//等待信号量
        cout<<"Thread#  "<<*pNo<<"get the Semaphore"<<endl;
        Sleep(1000*(*pNo));
        cout<<"Thread#  "<<*pNo<<"release Semaphore"<<endl;
        ReleaseSemaphore(hSemaphore,1,NULL);//释放对信号量的所有权
        return 1;
    }
    
    int main(int argc,char *argv[])
    {
        int ThNo[6];
        DWORD dw;
        hSemaphore = CreateSemaphore(NULL,3,3,NULL);//创建信号量 ,最大计数值为3
        for(int i=0;i<6;i++)
        {
            ThNo[i]=i+1;
            CreateThread(NULL,0,MyThread,&ThNo[i],NULL,&dw);//创建线程
        }
        Sleep(6000);//6000毫秒后结束进程
        return 0;
    }
  • 相关阅读:
    双色球的概率和收益
    伽玛函数
    概率统计13——二项分布与多项分布
    贝叶斯决策理论(1)
    线性代数笔记34——左右逆和伪逆
    线性代数笔记33——基变换和图像压缩
    线性代数笔记32——线性变换及对应矩阵
    线性代数笔记31——奇异值分解
    线性代数笔记30——相似矩阵和诺尔当型
    线性代数笔记29——正定矩阵和最小值
  • 原文地址:https://www.cnblogs.com/fripside/p/2909140.html
Copyright © 2011-2022 走看看