2013-09-28 74 views
1

我新的並行線程和我寫了一個示例程序以利用並行線程條件事件..Pthread的同步化查詢

線程2只是不列入出口,其目的是從代碼我想非常清楚。

#include<stdio.h> 
#include<stdlib.h> 
#include<pthread.h> 

pthread_mutex_t mut; 
pthread_cond_t con; 

#define LOCK &mut 
#define COND &con 

#define HAPPY 1 
#define SAD 0 

int count = 0, response = SAD; 

void func_t1(); 
void func_t2(); 

int main() 
{ 
    pthread_t tid1, tid2; 

    pthread_create(&tid1, NULL, &func_t1, NULL); 
    pthread_create(&tid2, NULL, &func_t2, NULL); 

    pthread_join(tid1, NULL); 
    pthread_join(tid2, NULL); 

    return 0; 
} 

void func_t1() 
{ 
    for (;;) 
    { 
    pthread_mutex_lock(LOCK); 

    pthread_cond_wait(COND, LOCK); 
    if (count == 10) 
    { 
     printf("Thread1: You did your job finally, get lost now"); 
     response = HAPPY; 
     pthread_mutex_unlock(LOCK); 
     break; 
    } 
    else 
    { 
     printf("Thread1: You are not capable of making me happy"); 

     pthread_mutex_unlock(LOCK); 
    } 
    } 
} 

void func_t2() 
{ 
    for (;;) 
    { 
    if (response == SAD) 
    { 
     pthread_mutex_lock(LOCK); 
     count++; 
     printf("thread2: count incremented to %d...pls check if you are happy \n", 
      count); 
     pthread_cond_signal(COND); 
     pthread_mutex_unlock(LOCK); 
    } 
    else 
    { 
     printf("thread2:Ha..I finally made her happy \n"); 
     break; 
    } 
    } 
} 

輸出:

thread2: count incremented to 106927...pls check if you are happy 
thread2: count incremented to 106928...pls check if you are happy 
thread2: count incremented to 106929...pls check if you are happy 
thread2: count incremented to 106930...pls check if you are happy 
thread2: count incremented to 106931...pls check if you are happy 
thread2: count incremented to 106932...pls check if you are happy 
thread2: count incremented to 106933...pls check if you are happy 
thread2: count incremented to 106934...pls check if you are happy 
thread2: count incremented to 106935...pls check if you are happy 
thread2: count incremented to 106936...pls check if you are happy 
thread2: count incremented to 106937...pls check if you are happy 
thread2: count incremented to 106938...pls check if you are happy 
thread2: count incremented to 106939...pls check if you are happy 
thread2: count incremented to 106940...pls check if you are happy 
thread2: count incremented to 106941...pls check if you are happy 
thread2: count incremented to 106942...pls check if you are happy 
thread2: count incremented to 106943...pls check if you are happy 
Thread1: You are not capable of making me happythread2: count incremented to 106944...pls check if you are happy 
thread2: count incremented to 106945...pls check if you are happy 
thread2: count incremented to 106946...pls check if you are happy 
thread2: count incremented to 106947...pls check if you are happy 
thread2: count incremented to 106948...pls check if you are happy 
thread2: count incremented to 106949...pls check if you are happy 
thread2: count incremented to 106950...pls check if you are happy 
thread2: count incremented to 106951...pls check if you are happy 
thread2: count incremented to 106952...pls check if you are happy 
thread2: count incremented to 106953...pls check if you are happy 
thread2: count incremented to 106954...pls check if you are happy 
thread2: count incremented to 106955...pls check if you are happy 
thread2: count incremented to 106956...pls check if you are happy 
thread2: count incremented to 106957...pls check if you are happy 
thread2: count incremented to 106958...pls check if you are happy 
thread2: count incremented to 106959...pls check if you are happy 

它永遠不會結束....

將是有益的,如果你能在上面的代碼中指出的缺陷。

回答

0

所以你基本上有兩個線程的程序:

第一個線程等待計數的到來10.在信號喚醒線程從2

線程2個遞增計數變量併發送一個信號,並重復。

沒有什麼,保證線程1會看到每一個變化來算,因爲線程2不等待答覆從線程1

相反,它可能看起來像:

Thread 2 increments count & signals 
Thread 2 increments count & signals 
Thread 2 increments count & signals 
Thread 2 increments count & signals 
Thread 1 sees signal - not 10 
Thread 2 increments count & signals 
Thread 2 increments count & signals 
Thread 2 increments count & signals 
Thread 1 sees signal - not 10 
... 
... 

你如果線程1檢查了count的當前值並且是SAD,則需要添加一種機制,該機制僅允許線程2遞增計數。