2012-02-06 2 views
0

내 코드가 작동하지 않는 것 :Qt, QMutex는 어떻게 작동합니까? 다음과 같이

int main(int argc, char* argv[]) 
{ 
    MyThread myThread1; 
    MyThread myThread2; 
    myThread1.start(); 
    myThread2.start(); 

    qDebug("Hello World"); 

    myThread1.wait(); 
    qDebug("myThread1 is finished..."); 
    myThread2.wait(); 
    qDebug("myThread2 is finished..."); 

    return 0; 
} 

>

class MyThread : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit MyThread(QObject *parent = 0); 
    void run(); 
}; 

>

void MyThread::run() 
{ 
    QMutex mutex(); 
    int x = 10000; 
    mutex.lock(); 

    while(x != 0) { 
     sleep(1); 
     qDebug("%d, x = %d ", thread()->currentThreadId(), x); 
     x--; 
    } 

    mutex.unlock(); 
} 

그러나 결과는 다음과 같습니다

Hello World 
5516, x = 10000 
6060, x = 10000 
5516, x = 9999 
6060, x = 9999 
5516, x = 9998 
6060, x = 9998 
5516, x = 9997 
6060, x = 9997 
... 
... 
나는 결과에 원하는

은 다음과 같습니다

 
xxxx: 10000 
xxxx: 9999 
xxxx: 9998 
xxxx: 9997 
... 
... 
xxxx:  1 

yyyy: 10000 
yyyy: 9999 
... 
... 
yyyy:  1 

이유는 무엇입니까? 내 잘못은 어디 있니? QMutex 사용법 ... 감사합니다 ...

+1

작업을 순차적으로 실행하고 싶을 때 스레딩의 요점은 무엇입니까? – bummzack

+0

코드를 업데이트했습니다. 고맙습니다 ... –

+0

여전히 ... 스레드 2가 스레드 1이 완료 될 때만 시작 하시겠습니까? 그렇다면 왜 두 개의 스레드가 있습니까? 당신의 코드에는 정확하지 않은 것들이 많이 있지만, 당신이 무엇을 하려는지 확실하지 않습니다. 조금만 설명해주세요. – UmNyobe

답변

3

실행 호출 범위 내에서 뮤텍스를 생성합니다. 뮤텍스가 thread2의 실행을 멈추거나 지연 시키길 원한다면 매번 객체가 자신의 뮤텍스를 생성하지 않도록 선언해야합니다.

// .h 
class MyThread { 
    ... 
private: 
static QMutex mutex; 
} 


// .cpp 
QMutex MyThread::mutex; 



// .cpp 
void MyThread::run() 
{ 
    QMutexLocker lock(&mutex) 

    // do stuff then return 
    // and the mutex will be unlocked when 
    // you leave this scope 
} 
+0

감사합니다 ... 귀하의 조언에 따르면, –

1

뮤텍스 개체는 로컬 개체입니다. 따라서 스레드는 다른 뮤텍스를 사용하고 잠금은 다른 것에 영향을주지 않습니다.

해결하려면 QMutex 개체를 두 스레드가 액세스 할 수있는 위치로 이동하십시오. 예를 들어, 전역 변수로 만드십시오.

lock()unlock()을 명시 적으로 호출하는 대신 RAII 형식의 QMutexLocker을 사용하는 것이 더 쉽습니다.

+0

답변 해 주셔서 감사합니다. 나는 그것을 해결합니다 .. –

0

developper의 설명 here을 살펴볼 수 있습니다.

이것은 잠금없는 프로그래밍으로 다시 구현하기가 어렵고 디버깅 및 검증이 훨씬 어렵습니다.

그러나 QMutex은 Linux 플랫폼에서 사용하는 futexes을 가리 킵니다.
이식성이 문제가되지 않는 경우에 사용할 수 있습니다.

이 질문에 대한 답변입니다.

그러나 특별한 경우에는 실제로 필요하지 않습니다. 모든 작업자 스레드가 공유해야하는 전역 뮤텍스를 만들면 트릭을 수행해야합니다.