• 016 信号量 7


    信号量

    ●  CreateSemaphore

      函数原型

    1 HANDLE WINAPI CreateSemaphore(
    2   _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    3   _In_     LONG                  lInitialCount,
    4   _In_     LONG                  lMaximumCount,
    5   _In_opt_ LPCTSTR               lpName
    6 );

      ○ 参数1:lpSemaphoreAttributes [in, optional]
        指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则处理不能由子进程继承。
      ○ 参数2:llInitialCount [in]
        这个信号量对象的初始计数。这个值必须大于或等于0,小于等于lMaximumCount。信号量的状态是当计数大于0时的信号,当它为零的时候没有信号。当等待函数释放等待信号量的线程时,计数会减少1。通过调用ReleaseSemaphore函数来增加指定数量的计数。
      ○ 参数3:llMaximumCount [in]
        这个信号量对象的最大计数。这个值必须大于零。
      ○ 参数4:lpName [in, optional]

        信号量对象的名称。名称长度限于MAX_PATH字符。名称比较是区分大小写的。

      ○ Return value 返回值:HANDLE
        如果函数成功,返回值是对信号量对象的句柄。如果在函数调用之前存在已命名的信号量对象,则函数返回现有对象的句柄,GetLastError返回error_already_存在。
        如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。

    ●  OpenSemaphore

      函数原型

    1 HANDLE WINAPI OpenSemaphore(
    2   _In_ DWORD   dwDesiredAccess,
    3   _In_ BOOL    bInheritHandle,
    4   _In_ LPCTSTR lpName
    5 );

      ○ 参数1:dwDesiredAccess [in]
        对信号量对象的访问。如果指定对象的安全描述符不允许调用进程的请求访问,则该函数失败。有关访问权限的列表.
      ○ 参数2:bInheritHandle [in]
        如果这个值是真的,这个进程创建的进程将继承这个句柄。否则,进程不会继承这个句柄。
      ○ 参数3:lpName [in]
        要打开的信号量的名称。名称比较是区分大小写的。
      ○ Return value 返回值:HANDLE
        如果函数成功,返回值是对信号量对象的句柄。
        如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。

    ●  ReleaseSemaphore

      函数原型

    1 BOOL WINAPI ReleaseSemaphore(
    2   _In_      HANDLE hSemaphore,
    3   _In_      LONG   lReleaseCount,
    4   _Out_opt_ LPLONG lpPreviousCount
    5 );

      ○ 参数1:HANDLE hSemaphore
        CreateSemaphore 或者 OpenSemaphore 返回的句柄
        SEMAPHORE_MODIFY_STATE权限。有关更多信息,请参见同步对象安全性和访问权限。
      ○ 参数2:LONG lReleaseCount
        用于增加信号量对象当前计数的量。值必须大于零。如果指定的数量会导致信号量的计数超过在创建信号量时指定的最大值,计数不会改变,函数返回FALSE。
      ○ 参数3:LPLONG lpPreviousCount
        一个指向一个变量的指针,以接收之前对信号量的计数。如果不需要以前的计数,该参数可以为空。

      ○ Return value 返回值:BOOL
        成功返回一个非零的数
        错误返回 0 使用GetLastError 获取错误信息

     1 #define UNICODE
     2 #include <stdio.h>
     3 #include <process.h>
     4 #include <windows.h>
     5 
     6 //能够启动多少次
     7 
     8 int main()
     9 {
    10     //Semaphroe
    11     // 计数 count 能够 wait多少次 每次使用wait 都会递减
    12     HANDLE hSemaphroe = CreateSemaphore(nullptr, 0, 5, TEXT("Demo"));
    13     //OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, TEXT("Demo"));
    14     ReleaseSemaphore(hSemaphroe, 2, nullptr);
    15     WaitForSingleObject(hSemaphroe, INFINITE);
    16     WaitForSingleObject(hSemaphroe, INFINITE);
    17     WaitForSingleObject(hSemaphroe, INFINITE);
    18     WaitForSingleObject(hSemaphroe, INFINITE);
    19     WaitForSingleObject(hSemaphroe, INFINITE);
    20     WaitForSingleObject(hSemaphroe, INFINITE);
    21     return 0;
    22 }
  • 相关阅读:
    MillerRabin
    BM算法总结
    高斯消元处理自由变元的方法
    [IOI2019]矩形区域
    费用流处理负圈的方法
    回文自动机(PAM)总结
    [TJOI2017]龙舟
    luogu P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈
    博弈论
    构造
  • 原文地址:https://www.cnblogs.com/sdk123/p/7140426.html
Copyright © 2020-2023  润新知