단일 스레드 방식의 합계 계산 예제 코드:
#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()과 유사하게 작동하여 모든 스레드의 작업 완료를 보장합니다.