QT多线程实现线程间阻塞超时等待同步消息,并且防止等待线程的消息被篡改
时间: 2024-10-10 19:14:34 浏览: 26
在Qt中,使用`QThread`和信号槽机制可以方便地处理多线程间的通信。要实现线程间阻塞超时等待同步消息并且防止消息被篡改,你可以使用`QWaitCondition`和`QMutex`进行同步。
首先,确保每个线程都有自己的`QMutex`(互斥锁)和`QWaitCondition`(条件变量),用于保护共享数据和同步操作:
```cpp
class SharedData {
public:
// 共享数据
int sharedValue;
QMutex mutex; // 互斥锁
QWaitCondition cond; // 条件变量
// 发布更新信号
void updateSharedValue(int newValue) {
std::lock_guard<QMutex> lock(mutex);
sharedValue = newValue;
cond.wakeAll(); // 醒所有等待的线程
}
};
// 使用线程
class WorkerThread : public QThread {
private:
SharedData* data;
bool done;
public:
WorkerThread(SharedData* d) : data(d), done(false) { start(); }
protected:
void run() override {
while (!done) {
if (data->waitForCondition(std::chrono::seconds(5))) { // 设置超时时间
// 检查是否有新的值
int currentValue = data->sharedValue;
// 进行你需要的任务,比如处理新值
processNewValue(currentValue);
} else {
// 超时后,继续检查
}
}
}
// 完成任务后通知主线程
void finishWork() {
done = true;
emit finished();
}
};
```
在这个例子中,`WorkerThread`会在指定时间内等待`SharedData`中的`updateSharedValue`信号。如果在超时时间内没有接收到信号,线程将继续循环。`QMutex`保证了对`sharedValue`的访问是原子的,而`QWaitCondition`则用于线程之间的唤醒和阻塞。
为了防止消息被篡改,只有拥有互斥锁的线程才能修改`sharedValue`。当主线程或其他线程调用`updateSharedValue`时,它们会被锁定,直到完成更新并释放互斥锁,这时其他等待的线程才会被唤醒。