硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1466|回复: 0
收起左侧

C++多线程同步之Semaphore(信号量)

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2021-1-29 16:10:47 | 显示全部楼层 |阅读模式
C++多线程同步之Semaphore(信号量)
原文: https://www.cnblogs.com/lenmom/p/7998969.html


相关函数和头文件//头文件
#include <windows.h>

//创建信号量API
HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//指向SECURITY_ATTRIBUTES的指针;
_In_     LONG                  lInitialCount,          //信号量对象的初始值;
_In_     LONG                  lMaximumCount,  //信号量对象的最大值,这个值必须大于0;
_In_opt_ LPCTSTR               lpName                 //信号量对象的名称;
);

//等待信号量API
DWORD WINAPI WaitForSingleObject(
  _In_ HANDLE hHandle,          //信号量对象句柄
  _In_ DWORD  dwMilliseconds    //等待信号量时间,INFINET代表永久等待;
);
返回值:
WAIT_ABANDONED(0x00000080L) 表示拥有信号量的线程再终止前未释放该信号量;
WAIT_OBJECT_0(0x00000000L)  表示等到了信号量;
WAIT_TIMEOUT(0x00000102L)   表示等待超时;
WAIT_FAILED((DWORD)0xFFFFFFFF)  表示该函数执行失败,用GetLastError()得到错误码;  

//释放信号量句柄
BOOL WINAPI ReleaseSemaphore(
  _In_      HANDLE hSemaphore,         //信号量对象句柄;
  _In_      LONG   lReleaseCount,      //信号量释放的值,必须大于0;
  _Out_opt_ LPLONG lpPreviousCount     //前一次信号量值的指针,不需要可置为空;
);
返回值:成功返回非0;

Win32平台下源码

#include <iostream>
#include <windows.h>
using namespace std;


HANDLE g_hSemaphore = NULL;                             //声明信号量变量


unsigned long WINAPI Fun(LPVOID lpParamter)
{
    int iRunTime = 0;
    //执行100次跳出
    while(++iRunTime<100)
    {
        WaitForSingleObject(g_hSemaphore, INFINITE);      //信号量值-1
        cout << "Fun() is running!"<<endl;
        ReleaseSemaphore(g_hSemaphore, 1, NULL);          //信号量值+1
        Sleep(10);
    }
    ExitThread(-1);
}


int main()
{
    //创建信号量对象
    g_hSemaphore = CreateSemaphore(NULL          //信号量的安全特性
                                  , 1            //设置信号量的初始计数。可设置零到最大值之间的一个值
                                  , 1            //设置信号量的最大计数
                                  , NULL         //指定信号量对象的名称
                                  );
    if(NULL == g_hSemaphore)
    {
        cout << "create hSemaphore failed! error_code:"<<GetLastError()<<endl;
        return 0;
    }


    int iRunTime = 0;
    unsigned long ulThreadId = 0;
    //创建一个子线程
    HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, &ulThreadId);


    //执行100次跳出
    while(++iRunTime<100)
    {
        WaitForSingleObject(g_hSemaphore, INFINITE);   //信号量值-1
        cout << "main() is running, Thread id is " << ulThreadId <<endl;
        ReleaseSemaphore(g_hSemaphore, 1, NULL);       //信号量值+1
        Sleep(10);
    }
    system("pause");
    return 0;
}


执行结果:

可见未对屏幕资源产生“争夺”的情况,达到线程同步的目的。





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-23 23:09 , Processed in 0.241669 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表