首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSystemSemaphore::() abort

QSystemSemaphore::() abort
EN

Stack Overflow用户
提问于 2016-11-08 13:45:29
回答 1查看 486关注 0票数 0

我使用QSharedMemory和QSystemSemaphore来组织几个进程之间的事件交换。QSharedMemory存储接收者和事件数据的数量。接收者在QSystemSem标中等待::are ()。发送者通过QSystemSem标通知他们::release(接收者的数量)。

除了在共享内存中引入“真”/“假”标志,以及在终止过程中随后生成“假”事件之外,是否有任何方法优雅地终止接收进程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 13:53:12

QThread::terminate()在每个平台上都能工作,不管线程目前在做什么。当然,当您终止了应用程序中的任何线程时,唯一安全的方法是调用abort:进程通常处于中断状态。在您调用之后,除了abort()-ing之外什么也不做。由于它的破坏性很强,所以您最好放弃调用terminate并直接中止。

您的问题的措辞就好像您计划在调用terminate之后继续使用应用程序一样。你不能这样!

唉,如果您只想让一个线程退出,而信号量是一个同步原语,那么您可以通过设置一个标志和释放信号量来轻松地完成这个任务。下面是一个有点做作的例子,因为您通常不会以这种方式使用线程池:它只是为了缩短代码。

代码语言:javascript
复制
// https://github.com/KubaO/stackoverflown/tree/master/questions/semaphore-quit-40488523
#include <QtCore>

class Worker : public QRunnable {
    static const QString m_key;
    static QAtomicInteger<bool> m_abort;
    void run() override {
        QSystemSemaphore sem{m_key};
        qDebug() << "working";
        while (true) {
            sem.acquire();
            if (m_abort.load()) {
                sem.release();
                qDebug() << "aborting";
                return;
            }
            sem.release();
        }
    }
public:
    static void acquire(int n = 1) {
        QSystemSemaphore sem{m_key};
        while (n--)
            sem.acquire();
    }
    static void release(int n = 1) {
        QSystemSemaphore{m_key}.release(n);
    }
    static void quit(int n) {
        m_abort.store(true);
        release(n);
    }
};
const QString Worker::m_key = QStringLiteral("semaphore-quit-40488523");
QAtomicInteger<bool> Worker::m_abort = false;

int main()
{
    QThreadPool pool;
    QVarLengthArray<Worker, 20> workers{20};
    for (auto & worker : workers) {
        worker.setAutoDelete(false);
        pool.start(&worker);
    }
    Worker::release(workers.size()); // get some workers churning
    QThread::sleep(5);
    Worker::acquire(workers.size()); // pause all the workers
    Worker::quit(workers.size());
    // The thread pool destructor will wait for all workers to quit.
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40488523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档