한국어
Qt
 

C++ Class QThread 및 QMutex 예제

makersweb 2021.01.12 21:25 조회 수 : 5881

멀티 스레드에서 공유 리소스에 대한 동시 액세스로 인해 경합이 발생할 수 있다. 다음은 멀티스레드에서 안전하지 않은 전형적인 예를 보여준다. 

#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();
    }
};

 

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 118822
140 UI 폼(Form)작성 시 탭 순서(Tab Order) 설정 file makersweb 2020.08.24 9522
139 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 9510
138 C++로 작성한 클래스를 QML에서 생성 file makersweb 2021.02.10 9482
137 Windows에서 라즈베리파이3 Qt 어플리케이션 개발 및 원격 실행 file makersweb 2018.02.23 9478
136 Qt기반의 오픈소스 프로젝트들 makersweb 2019.05.15 9357
135 멀티 스레드환경, 스레드에 안전한 이벤트처리 makersweb 2016.10.27 9314
134 Qt 를 사용하거나 기반으로 하는 응용프로그램 file makersweb 2021.01.30 9265
133 QString 문자열에서 숫자만 추출해서 QString으로 반환 makersweb 2017.01.10 9162
132 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 9032
131 Qml에서 키보드 입력 이벤트 핸들링 file makersweb 2018.08.09 9016
130 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 [1] file makersweb 2020.02.12 8994
129 Qt응용프로그램 실행 시 콘솔창(터미널)같이 띄우기 file makersweb 2019.01.16 8857
128 Widgets(C++) 기반의 기본 스타일을 Dark 테마 및 Material 디자인 스타일로 바꾸기 file makersweb 2023.01.28 8682
127 QTextCodec클래스를 사용하여 유니코드와 EUC-KR 변환 makersweb 2019.03.25 8650
126 QML에서 앵커(anchors)로 위치 지정 file makersweb 2021.10.05 8562
125 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 8534
124 Qml 기본 컴포넌트 강좌 (4) - 모델 리스팅(Listing) file 운영자 2019.02.23 8455
123 Windows에서 Qt D-Bus를 사용하여 프로세스간 통신(IPC) file makersweb 2019.05.02 8304
122 Qt Bluetooth를 이용한 시리얼(Serial) 통신 file makersweb 2019.02.17 8144
121 QNetworkAccessManager를 통해 HTTP POST 하는 예제 makersweb 2019.01.17 8049