gpt4 book ai didi

c++ - 实现多线程环境

转载 作者:行者123 更新时间:2023-11-30 04:38:50 24 4
gpt4 key购买 nike

我想使用 Qt4 实现多线程环境。类似c++的伪代码思路如下:

class Thread : public QThread {
QList<SubThread*> threads_;

public:
void run() {
foreach(SubThread* thread : threads) {
thread.start();
}

foreach(SubThread* thread : threads) {
thread.wait();
}
}

void abort() {
foreach(SubThread* thread : threads) {
thread.cancel();
}
}

public slots:
// This method is called from the main-thread
// (sometimes via some signal-slot-connection)
void changeSomeSettings() {
abort();
// change settings
start();
}
}

class SubThread : public QThread {
bool isCancelled_;

public:
void run() {
while(!isCancelled or task completed) {
// something that takes some time...
}
}

void cancel() {
if(isRunning() {
isCancelled_ = true;
}
}
}

目的是插槽 changeSomeSettings() 杀死所有正在运行的线程,提交其更改并重新启动它。我想要实现的是,一旦启动此方法,它就会调用“中止”,然后等待所有线程终止。以错误的方式使用互斥量:

    void Thread::changeSomeSettings() {
mutex1.lock();
abort();

mutex2.lock();

start();
mutex1.unlock();
}

void Thread::run() {
foreach(Thread* thread : threads) {
thread.start();
}

foreach(Thread* thread : threads) {
thread.wait();
}

mutex2.unlock();
}

这实际上在 MacOSX 下的 Qt 中有效,但根据文档,mutex2 必须在同一线程中解锁(在 Windows 中我得到一个错误)。在不陷入竞争条件和僵局的情况下实现我的目标的最佳方法是什么?有没有比我在这里提出的更好的设计?

最佳答案

对于这种情况,您可能希望使用条件变量而不是互斥量。条件变量是一个线程向另一个线程发送信号的一种方式。 QT 的实现似乎是 QTWaitCondition :

我可能让子线程定​​期检查条件变量的状态。这可以通过具有短/0 超时的 QTWaitCondition::wait() 来完成。如果收到信号,则锁定包含更新数据的共享内存区域并访问需要更新的数据。然后该线程可以相应地安全地重新启动。

中止一个线程通常不是一个好主意。您可能最终会泄漏内存/资源/句柄/锁/等。您不知道该线程在其调用堆栈中的位置,并且可能无法保证堆栈将为您“解开”并且调用所有析构函数。这是子线程定期检查条件变量以获取更新数据并让它们使用新数据安全地重新启动的另一个原因。

关于c++ - 实现多线程环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com