QT의 사용 QMutex/QMutexLocker 상호 배율 동기화 스레드의 작은 예

3236 단어 QT
이어서 다중 스레드에서 기본적으로 스레드 동기화 문제를 해결해야 한다. 이 글은 주로 QMutex/QMutexLocker 상호 배척량을 사용하여 스레드를 동기화하는 방법을 소개한다.
먼저, Qt 홈페이지 QThreads general usage 소개를 살펴보면 그 중 한 부분은 기본적으로 그 사용 방법을 소개했는데 다음과 같다.
    The main thing in this example to keep in mind when using a QThread is that it's not a thread. It's a wrapper around a thread object. This wrapper provides the signals, slots and methods to easily use the thread object within a Qt project. To use it, prepare a QObject subclass with all your desired functionality in it. Then create a new QThread instance, push the QObject onto it using moveToThread(QThread*) of the QObject instance and call start() on the QThread instance. That's all. You set up the proper signal/slot connections to make it quit properly and such, and that's all.
지금 바로 표를 파는 작은 예:
    Step1. Qt에서 설명한 사용법: 먼저 QObject를 계승하는 클래스를 만들고 실행할 함수를 안에 포장한다.
.h 파일 코드는 다음과 같습니다.
#ifndef TICKETSELLER_H
#define TICKETSELLER_H

#include 
#include 
#include 
#include 

class TicketSeller : public QObject
{
public:
    TicketSeller();

    ~TicketSeller();

public slots:
    void sale();

public:
    int* tickets;

    QMutex* mutex;

    std::string name;
};

#endif // TICKETSELLER_H

.cpp 파일 코드는 다음과 같습니다.
#include "ticketseller.h"
#include 

TicketSeller::TicketSeller()
{
    tickets = 0;
    mutex = NULL;
}

TicketSeller::~TicketSeller()
{

}

void TicketSeller::sale()
{
    while((*tickets) > 0)
    {
        mutex->lock();
        std::cout << name << " : " << (*tickets)-- << std::endl;
        mutex->unlock();
    }

    /*while((*tickets) > 0)
    {
        QMutexLocker locker(mutex);
        std::cout << name << " : " << (*tickets)-- << std::endl;
        locker.unlock();
    }*/
}

    Step2. Qt에서 설명한 사용법에 따라 예를 만들고 moveToThread를 사용하여 대상을 QThread 안으로 옮기고 신호 슬롯을 연결하고 start () 방법을 호출합니다.
main.cpp 파일 코드는 다음과 같습니다.
#include 
#include 
#include 
#include 
#include "ticketseller.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);   

    int ticket = 100;
    QMutex mutex;

    /*      1*/
    //    1
    QThread t1;
    TicketSeller seller1;
    //    1
    seller1.tickets = &ticket;
    seller1.mutex = &mutex;
    seller1.name = "seller1";
    //        
    seller1.moveToThread(&t1);

    /*      2*/
    //    2
    QThread t2;
    TicketSeller seller2;
    seller2.tickets = &ticket;
    seller2.mutex = &mutex;
    seller2.name = "seller2";
    //        
    seller2.moveToThread(&t2);

    QObject::connect(&t1, &QThread::started, &seller1, &TicketSeller::sale);
    QObject::connect(&t2, &QThread::started, &seller2, &TicketSeller::sale);

    t1.start();
    t2.start();

    return a.exec();
}

QT에서 QMutex/QMutex Locker를 사용하는 것은 Window API Create Mutex와 WaitFor Single Object 동기화 라인을 맞추는 것보다 훨씬 간단합니다.

좋은 웹페이지 즐겨찾기