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];
    }
}

Qt 信号量使用方法_第1张图片

你可能感兴趣的:(Qt,技术,qt,开发语言)