zoukankan      html  css  js  c++  java
  • 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    LintCode-35.翻转链表
    LintCode-159.寻找旋转排序数组中的最小值
    LintCode-73.前序遍历和中序遍历树构造二叉树
    LintCode-9.Fizz Buzz 问题
    NOI 2018 归程 (Kruskal重构树)
    模板 NTT 快速数论变换
    模板 FFT 快速傅里叶变换
    BZOJ 3510 首都 (LCT)
    BZOJ 4530 [BJOI2014]大融合 (LCT)
    BZOJ 3282 Link Cut Tree (LCT)
  • 原文地址:https://www.cnblogs.com/findumars/p/10247612.html
Copyright © 2011-2022 走看看