멀티 스레드에서 공유 리소스에 대한 동시 액세스로 인해 경합이 발생할 수 있다. 다음은 멀티스레드에서 안전하지 않은 전형적인 예를 보여준다.
#include <QThread>
class Thread : public QThread
{
bool m_cancel;
public:
explicit Thread(QObject *parent = nullptr)
: QThread(parent), m_cancel(false) {}
void cancel() // called by GUI
{
m_cancel = true;
}
private:
bool isCanceled() const // called by run()
{
return m_cancel;
}
void run() override { // reimplemented from QThread
while (!isCanceled())
doSomething();
}
};
다음은 QMutex 를 사용하여 스레드를 동기화는 방법을 보여준다.
#include <QThread>
class Thread : public QThread
{
mutable QMutex m_mutex; // protects m_cancel
bool m_cancel;
public:
explicit Thread(QObject *parent = nullptr)
: QThread(parent), m_cancel(false) {}
void cancel() { // called by GUI
const QMutexLocker locker(&m_mutex);
m_cancel = true;
}
private:
bool isCanceled() const { // called by run()
const QMutexLocker locker(&m_mutex);
return m_cancel;
}
void run() override { // reimplemented from QThread
while (!isCanceled())
doSomething();
}
};