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