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 
#include 
#include 
#include 

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 
#include 
#include 
#include 

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。




你可能感兴趣的:(Qt)