멀티스레드 동기화 구현 방법

단일 스레드 방식의 합계 계산 예제 코드:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>

class SumCalculator : public QObject 
{
private:
    int startNum;
    int endNum;
    int total;

    void calculate()
    {
        qDebug() << "계산 시작: " << objectName();
        
        for(int i = startNum; i <= endNum; i++) 
        {
            total += i;
        }
        
        qDebug() << "계산 완료: " << objectName();
    }

public:
    SumCalculator(int start, int end) 
    {
        startNum = start;
        endNum = end;
        total = 0;
    }

    void execute() 
    {
        calculate();
    }

    int getResult() 
    {
        return total;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    
    qDebug() << "메인 스레드 시작";
    int finalSum = 0;
    
    SumCalculator calc1(1, 300);
    SumCalculator calc2(301, 600); 
    SumCalculator calc3(601, 1000);
    
    calc1.setObjectName("계산기1");
    calc2.setObjectName("계산기2");
    calc3.setObjectName("계산기3");
    
    calc1.execute();
    calc2.execute(); 
    calc3.execute();
    
    finalSum = calc1.getResult() + calc2.getResult() + calc3.getResult();
    
    qDebug() << "최종 합계: " << finalSum;
    qDebug() << "메인 스레드 종료";
    
    return app.exec();
}

이 코드는 순차적으로 실행되어 정확한 결과를 얻을 수 있지만, 처리 속도가 느리다는 단점이 있습니다.

멀티스레드 방식으로 개선한 예제:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>

class ParallelCalculator : public QThread
{
private:
    int rangeStart;
    int rangeEnd;
    int partialSum;
    
    void run() override
    {
        qDebug() << "스레드 시작: " << objectName();
        
        for(int i = rangeStart; i <= rangeEnd; i++)
        {
            partialSum += i;
            QThread::msleep(5); // 실제 작업 지연을 시뮬레이션
        }
        
        qDebug() << "스레드 완료: " << objectName();
    }

public:
    ParallelCalculator(int start, int end)
    {
        rangeStart = start;
        rangeEnd = end;
        partialSum = 0;
    }
    
    int getPartialSum()
    {
        return partialSum;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    
    qDebug() << "메인 스레드 시작";
    int total = 0;
    
    ParallelCalculator worker1(1, 300);
    ParallelCalculator worker2(301, 600);
    ParallelCalculator worker3(601, 1000);
    
    worker1.setObjectName("작업자1");
    worker2.setObjectName("작업자2");
    worker3.setObjectName("작업자3");
    
    worker1.start();
    worker2.start();
    worker3.start();
    
    // 스레드 동기화 추가
    worker1.wait();
    worker2.wait();
    worker3.wait();
    
    total = worker1.getPartialSum() + worker2.getPartialSum() + worker3.getPartialSum();
    
    qDebug() << "총합: " << total;
    qDebug() << "메인 스레드 종료";
    
    return app.exec();
}

이 코드는 스레드 동기화를 통해 병렬 처리의 장점을 유지하면서도 정확한 결과를 얻을 수 있습니다. wait() 함수는 pthread_join()과 유사하게 작동하여 모든 스레드의 작업 완료를 보장합니다.

태그: Qt 멀티스레드 동기화 QThread

9월 16일 05:19에 게시됨