我使用QSharedMemory和QSystemSemaphore来组织几个进程之间的事件交换。QSharedMemory存储接收者和事件数据的数量。接收者在QSystemSem标中等待::are ()。发送者通过QSystemSem标通知他们::release(接收者的数量)。
除了在共享内存中引入“真”/“假”标志,以及在终止过程中随后生成“假”事件之外,是否有任何方法优雅地终止接收进程?
发布于 2016-11-08 13:53:12
QThread::terminate()在每个平台上都能工作,不管线程目前在做什么。当然,当您终止了应用程序中的任何线程时,唯一安全的方法是调用abort:进程通常处于中断状态。在您调用之后,除了abort()-ing之外什么也不做。由于它的破坏性很强,所以您最好放弃调用terminate并直接中止。
您的问题的措辞就好像您计划在调用terminate之后继续使用应用程序一样。你不能这样!
唉,如果您只想让一个线程退出,而信号量是一个同步原语,那么您可以通过设置一个标志和释放信号量来轻松地完成这个任务。下面是一个有点做作的例子,因为您通常不会以这种方式使用线程池:它只是为了缩短代码。
// 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.
}https://stackoverflow.com/questions/40488523
复制相似问题