信号量

一、关于信号量

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;
}
原文地址:https://www.cnblogs.com/fripside/p/2909140.html