zoukankan      html  css  js  c++  java
  • C/C++ 信号量 CreateSemaphore 用法

    HANDLE CreateSemaphore(
      LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,  // SD
      LONG lInitialCount,                          // initial count
      LONG lMaximumCount,                          // maximum count
      LPCTSTR lpName                           // object name
    )
    此函数可用来创建或打开一个信号量先看参数说明
    lpSemaphoreAttributes:为信号量的属性,一般可以设置为NULL
    lInitialCount:信号量初始值,必须大于等于0,而且小于等于 lpMaximumCount,如果lInitialCount 的初始值为0,则该信号量默认为unsignal状态,如果lInitialCount的初始值大于0,则该信号量默认为signal状态,
    lMaximumCount: 此值为设置信号量的最大值,必须大于0
    lpName:信号量的名字,长度不能超出MAX_PATH ,可设置为NULL,表示无名的信号量。当lpName不为空时,可创建有名的信号量,若当前信号量名与已存在的信号量的名字相同时,则该函数表示打开该信号量,这时参数lInitialCount 和
    lMaximumCount 将被忽略。
    函数调用成功返回信号量句柄。
    释放信号量函数:
    BOOL ReleaseSemaphore( HANDLE hSemaphore, // handle to semaphore
    LONG lReleaseCount, // count increment amount
    LPLONG lpPreviousCount // previous count);
    参数说明:

    hSemaphore:信号量句柄,
    lReleaseCount:释放的数量,一般完成一个等待后调用此函数释放一个信号量,使得信号量平衡。
    lpPreviousCount :存放以前信号量的数量 ,一般可为NULL.

    打开信号量函数:
    HANDLE OpenSemaphore( DWORD dwDesiredAccess, // access BOOL bInheritHandle, // inheritance option LPCTSTR lpName// object name );
    此函数打开一个有名的信号量
    参数说明:
    dwDesiredAccess:对信号量的访问权限,取值可以是SEMAPHORE_ALL_ACCESS,可对信号量执行尽可能多的操作;可以是SEMAPHORE_MODIFY_STATE,允许使用ReleaseSemaphore释放信号量,达到修改信号量;还可以是SYNCHRONIZE,用等待函数异步的等待信号量变为signal状态
    bInheritHandle:如果为true,信号量句柄可被继承,反之不可继承。
    lpName :信号量的名字。

    别忘了最后使用完成后用CloseHandle()关闭信号量句柄
    暂时API写到此为止,以后还有关信号量的函数,再继续添加。下面通过一个例子,来说明使用信号量来世线程同步的例子,要求创建三个线程,每个线程次打印十次ID,必须三个线程一次打印。注意:在使用WaitForSingleObject等待信号量句柄时,若信号量为signal状态,则wait过后信号量自动减1,直到使用ReleaseSemaphore释放信号量,信号量才可增加
    代码如下:
    说明:创建控制台程序。

    #include "stdafx.h"
    #include <Windows.h>


    DWORD WINAPI Thread_1(LPVOID param);
    DWORD WINAPI Thread_2(LPVOID param);
    DWORD WINAPI Thread_3(LPVOID param);

    HANDLE hSM_1;
    HANDLE hSM_2;
    HANDLE hSM_3;

    HANDLE hThread_1;
    HANDLE hThread_2;
    HANDLE hThread_3;

    int _tmain(int argc, _TCHAR* argv[])
    {

    //创建三个信号量

    hSM_1 = CreateSemaphore(NULL, 1, 1, L"A");//开始为signal状态
    hSM_2 = CreateSemaphore(NULL, 0, 1, L"B");//开始为unsignal状态,等待hSM_1释放
    hSM_3 = CreateSemaphore(NULL, 0, 1, L"C");//开始为unsignal状态,等待hSM_2

    //创建三个线程

    hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL);
    hThread_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL);
    hThread_3 = CreateThread(NULL, 0, Thread_3, NULL, 0, NULL);
    //等待三个线程都执行完
    WaitForSingleObject(hThread_1, INFINITE);
    WaitForSingleObject(hThread_2, INFINITE);
    WaitForSingleObject(hThread_3, INFINITE);

    //三个线程都执行完
    printf(" main end ");
    //关闭句柄
    CloseHandle(hThread_1);
    CloseHandle(hThread_2);
    CloseHandle(hThread_3);
    CloseHandle(hSM_1);
    CloseHandle(hSM_2);
    CloseHandle(hSM_3);
    return 0;
    }

    DWORD WINAPI Thread_1(LPVOID param)
    {
    for (int i = 0; i < 10; i ++)
    {
    DWORD dwWait = WaitForSingleObject(hSM_1, INFINITE);

    //每一个wait过后信号量的数量自动减1,这样就达到了控制同步

    printf("A");
    ReleaseSemaphore(hSM_2, 1, NULL);
    }
    return 0;
    }

    DWORD WINAPI Thread_2(LPVOID param)
    {
    for (int i = 0; i < 10; i ++)
    {
    WaitForSingleObject(hSM_2, INFINITE);
    printf("B");
    ReleaseSemaphore(hSM_3, 1, NULL);
    }
    return 0;
    }

    DWORD WINAPI Thread_3(LPVOID param)
    {
    for (int i = 0; i < 10; i ++)
    {
    WaitForSingleObject(hSM_3, INFINITE);
    printf("C ");
    ReleaseSemaphore(hSM_1, 1, NULL);
    }
    return 0;
    }

    运行结果:
    C/C++ 信号量 CreateSemaphore 用法 - 快乐男孩 - 快乐男孩的博客

     

  • 相关阅读:
    InApp PurchaseVerifying Store Receipts[6]
    InApp PurchaseTesting a Store [7]
    App Store Review Guidelines
    JAVA基础之一维数组和多维数组
    定位标记
    JSTL常用标签汇总
    struts1.2原理
    struts1.2中的ActionForm
    jdbc连接
    ActionForm与bean的区别
  • 原文地址:https://www.cnblogs.com/priarieNew/p/9753419.html
Copyright © 2011-2022 走看看