1. 程式人生 > >QSystemSemaphore 系統級訊號量

QSystemSemaphore 系統級訊號量

在之前的一篇文章中,我們講過了QSemaphore類,其可以用於同步多執行緒。而今天要講到的這個類,根據名字就可以猜測到,其可以在整個系統中使用,即它既可以用於多執行緒,也可以用於多執行緒。當然,這也意味著,QSystemSemaphore類是一個比較重量級的類,所以,除非在同步多程序的情況下,否則不應該使用該類。其他方面,該類和QSemaphore均相同,操作也相同。

我們先來看一下該類的建構函式:

QSystemSemaphore::QSystemSemaphore(const QString &key, int initialValue = 0, AccessMode mode = Open)
可見,其和QSemaphore相比,多了一個key,也可以理解為該訊號量的名字,多個程序間就是通過這個名字來操作同一個訊號量的。另外還多了一個mode引數,該引數可以取兩個值Open和Create。其中,Open在請求的訊號量已存在時,就使用它,並且不會重置訊號的資源數,如果請求的訊號量不存在,就 建立它併為它設定初始的資源值。而對於Create來說,不管請求的訊號量是否已存在,它都會取得訊號量的擁有權,並設定初始值。所以,我們應該在第一次建立訊號量時,為其傳入Create引數。但在Windows平臺上,Create和Open的行為相同,因為,Windows平臺上不存在應用程式崩潰後,訊號量還存在的情況。
下面,我們寫兩個應用程式來使用一下系統級的訊號量。

新建兩個Qt控制檯程式SystemSem1和SystemSem2,程式碼如下:

SystemSem1:

#include <QCoreApplication>
#include <QSystemSemaphore>
#include <QDebug>
#include <QThread>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QSystemSemaphore sem("sem", 1, QSystemSemaphore::Create);
while(true)
{
sem.acquire();
qDebug() << QCoreApplication::applicationPid();

QThread::sleep(1);
sem.release();
}

return a.exec();
}
SystemSem2:
#include <QCoreApplication>
#include <QSystemSemaphore>
#include <QDebug>
#include <QThread>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QSystemSemaphore sem("sem", 1, QSystemSemaphore::Open);
while(true)
{
sem.acquire();
qDebug() << QCoreApplication::applicationPid();

QThread::sleep(1);
sem.release();
}

return a.exec();
}

我們在SystemSem1中建立訊號量,在SystemSem2中開啟訊號量。
啟動這兩個程式,可以看到,每隔1秒,兩個程式會交替輸出各自的程序ID。
---------------------
作者:求道玉
來源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/70158300
版權宣告:本文為博主原創文章,轉載請附上博文連結!