当前位置: 首页 > news >正文

Qt 信号量使用方法

Qt 信号量使用方法

QSemaphore 类

常用函数介绍

函数名称函数功能
QSemaphore()构造并初始化对象
acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用
available()返回当前信号量可用的资源个数,这个数永远不可能为负数,如果为0,就说明当前没有资源可用
release()释放n个资源,如果信号量的资源已全部可用之后再释放,就可以创建更多的资源,增加可用资源的个数
tryAcquire()尝试获取n个资源,不成功时不阻塞线程

程序示例

五个车位,十辆车抢占,先占的占用3秒,然后让出车位

// 公共数据和信号量对象
struct TestData
{
    static bool m_sData[5];
    static QSemaphore m_sSemaphore;
};

bool TestData::m_sData[5] = { false, false, false, false, false };
QSemaphore TestData::m_sSemaphore(5);

// 线程类
class MyThread : public QThread
{
public:
    MyThread(int nId, QObject *parent = nullptr);
    ~MyThread() = default;

protected:
    void run() override
    {
        TestData::m_sSemaphore.acquire(1);		// 请求一个资源
        int nIndex = -1;

        for (int i = 0; i != 5; ++i)
        {
            if (!TestData::m_sData[i])
            {
                TestData::m_sData[i] = true;
                nIndex = i;
                break;
            }
        }

        if (nIndex > -1)
        {
            qDebug() << m_nId << QString::fromLocal8Bit("号车占用") << nIndex << QString::fromLocal8Bit("号车位");
            QThread::msleep(3000);
            TestData::m_sData[nIndex] = false;
            TestData::m_sSemaphore.release();		// 释放一个资源
        }
    }

private:
    int m_nId;
};

MyThread::MyThread(int nId, QObject *parent) : QThread(parent), m_nId(nId)
{

}

// 测试函数
void Test()
{
    MyThread* carArrThread[10];

    for (int i = 0; i != 10; ++i)
    {
        carArrThread[i] = new MyThread(i);
        carArrThread[i]->start();
    }

    for (int i = 0; i != 10; ++i)
    {
        carArrThread[i]->wait();
        delete  carArrThread[i];
    }
}

在这里插入图片描述

相关文章:

  • trae.ai 编辑器:前端开发者的智能效率革命
  • MySQL的不同字符集的排序规则
  • android gradle一直编译不下来,可能是打开了gradle离线模式
  • Redis 哨兵集群(Sentinel)与 Cluster 集群对比
  • SQL命令
  • TDengine 快速上手:安装部署与基础 SQL 实践(二)
  • docker软件安装
  • 使用linux 指令实现网络助手的功能
  • Git与SVN的区别以及各自的优势
  • Debian编译安装mysql8.0.41源码包 笔记250401
  • 在 Ubuntu 下通过 Docker 部署 WordPress 服务器
  • Unity中的UI坐标和点击接口
  • git中用于生成commitId与其父commitId间的文件差异文件树
  • 部分国产服务器CPU及内存性能测试情况
  • 【Git “push“ 命令详解】
  • Git Flow 分支管理详解
  • Linux 中dmesg, kern.log, syslog 什么关系?有什么用?
  • 汽车加气站操作工考试答题模板
  • linux xargs命令学习
  • Flink TaskManager之间数据传输(NetworkManager)
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 特朗普称加总理将很快访美,白宫:不影响将加拿大打造成“第51个州”计划
  • 五一首日出沪高峰,G1503高东收费站上午车速约30公里/小时
  • 今年五一假期出游人群规模预计比去年提升8%,哪里最热门?
  • “即买即退”扩容提质,上海静安推出离境退税2.0版新政
  • 五大国有银行明确将撤销监事会