2015-05-10 49 views
0

嗨我想讓3線程將多次打印不同的消息。然後同步它們,例如打印一個兩個三個一個兩個三個一個兩個三個......當我運行程序時有時候這是不正確的,我不知道我在做什麼錯誤。Posix Semaphores同步線程

sem_t sema, semb, semc; 


void *printone(void *arg) 
{ 
    printf("<ONE>"); 
    sem_wait(&semc); 
    sem_post(&semb); 
} 

void *printtwo(void *arg) 
{ 
    printf("<TWO>"); 
    sem_wait(&sema); 
    sem_post(&semc); 
} 

void *printthree(void *arg) 
{ 
    printf("<THREE>"); 
    sem_wait(&semb); 
    sem_post(&sema); 
} 

main() 

{ 
    pthread_t th1,th2,th3; 
    int i; 

    sem_init(&sema,0,1); 
    sem_init(&semb,0,0); 
    sem_init(&semc,0,0); 

    for(i=0;i<10;i++){ 

    pthread_create(&th1, NULL, printone, (void *) 1); 
    pthread_create(&th2, NULL, printtwo, (void *) 2); 
    pthread_create(&th3, NULL, printthree, (void *) 3); 

    pthread_join(th1, NULL); 
    pthread_join(th2, NULL); 
    pthread_join(th3, NULL); 
    } 



    pthread_exit(NULL); 

} 

回答

1

你似乎有一個可行的辦法:每一個線程等待一個信號量,以後的文章中另一個讓一個線程運行。然而,爲了這個工作,每個線程在之前應該等待它的信號量(即打印它的消息)。

此外,它看起來像你的線程函數使用錯誤的信號量。對於printone()首先運行,它必須等待您初始化值爲1的信號量。對於要運行的下一個printtwo(),它必須等待信號量爲printone()的帖子。同樣,對於printthree()

作爲次要的事情,如果你的線程函數不會使用它們的參數,那麼最好將NULL作爲第三個參數傳遞給pthread_create()

+0

幫助,非常感謝! – Artemis