原子操作
在Qt5中,主要有两种原子变量:
QAtomicInteger<T>
(用于整数类型的原子操作)QAtomicPointer<T>
(用于指针的原子操作)
下面给出两种变量的例子:
QAtomicInteger 示例(线程安全的计数器)
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/atomicinteger
#include <QCoreApplication>
#include <QAtomicInteger>
#include <QThread>
#include <QDebug>
QAtomicInteger<int> counter(0); // 线程安全的计数器
void threadFunc() {
for (int i = 0; i < 10; ++i) {
// 原子递增,多个线程操作时不会出现数据竞争
counter.fetchAndAddRelaxed(1);
QThread::msleep(100); // 模拟工作
}
}
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 使用 QThread::create 创建线程
QThread *t1 = QThread::create(threadFunc);
QThread *t2 = QThread::create(threadFunc);
t1->start();
t2->start();
t1->wait();
t2->wait();
qDebug() << "Final counter value:" << counter.load();
delete t1;
delete t2;
return 0;
}
Final counter value: 20
QAtomicPointer示例(线程安全地存取指针)
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/atomicpointer
#include <QCoreApplication>
#include <QAtomicPointer>
#include <QThread>
#include <QDebug>
struct Node {
int value;
};
QAtomicPointer<Node> atomicPtr(nullptr);
void threadFunc() {
Node* newNode = new Node{42};
atomicPtr.store(newNode); // 线程安全地存储指针
}
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QThread *t = QThread::create(threadFunc);
t->start();
t->wait();
qDebug() << "Atomic Pointer Value:" << atomicPtr.load()->value;
delete atomicPtr.load(); // 释放内存
return 0;
}
Atomic Pointer Value: 42