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