QList可以在多线程环境中使用,但是需要注意以下几点:
- QList不是线程安全的,因此在多个线程同时访问同一个QList对象时可能会导致数据竞争和未定义行为。
- 如果需要在多个线程之间共享QList对象,建议使用Qt提供的线程安全类,如QMutex、QReadWriteLock等来保护访问。
- 如果需要在多个线程之间传递数据,建议使用Qt提供的跨线程队列,如QtConcurrent::BlockingQueuedConnection来实现。
示例代码:
#include <QDebug>
#include <QMutex>
#include <QThread>
#include <QWaitCondition>
class MyWorker : public QObject
{
Q_OBJECT
public:
explicit MyWorker(QList<int>& list, QMutex& mutex, QWaitCondition& waitCond, QObject *parent = nullptr) :
QObject(parent), m_list(list), m_mutex(mutex), m_waitCond(waitCond) {}
public slots:
void doWork() {
// 从列表头部取出元素并打印
m_mutex.lock();
while (m_list.isEmpty()) {
m_waitCond.wait(&m_mutex);
}
int value = m_list.takeFirst();
qDebug() << "Removed:" << value;
m_mutex.unlock();
}
private:
QList<int>& m_list;
QMutex& m_mutex;
QWaitCondition& m_waitCond;
};
int main()
{
QList<int> list{1, 2, 3};
QMutex mutex;
QWaitCondition waitCond;
// 创建多个线程,每个线程从列表中取出一个元素并打印
QList<QThread*> threads;
for (int i = 0; i < 3; ++i) {
MyWorker* worker = new MyWorker(list, mutex, waitCond);
QThread* thread = new QThread();
worker->moveToThread(thread);
QObject::connect(thread, &QThread::started, worker, &MyWorker::doWork);
threads.append(thread);
}
// 启动所有线程,并唤醒等待条件
for (auto thread : threads) {
thread->start();
}
waitCond.wakeAll();
// 等待所有线程结束
for (auto thread : threads) {
thread->wait();
delete thread;
}
return 0;
}
输出结果:
Removed: 1
Removed: 2
Removed: 3