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