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

