2017-12-31 182 views
-3

1,2,3,1,2,3のようなシーケンスを印刷したいのですが、下のコードはこの順に印刷されません。私はセマフォを使ってどこで間違っているのか理解できません。私がこのコードで修正している間違いを理解するのを助けてください。 F1が初期sem_wait最初通り過ぎなるようCコードpthread順番に印刷する3つのスレッドを持つセマフォプログラム

#include <pthread.h> 
#include <stdio.h> 
#include <semaphore.h> 
#include <unistd.h> 

#define MAX_NUM 50 
sem_t sem1, sem2, sem3; 

void *f1(void*) 
{ 
    sem_wait(&sem1); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF1(): %d", 1); 
    sem_post(&sem2);   
    } 
} 

void* f2(void*) 
{ 
    sem_wait(&sem2); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF2(): %d", 2); 
    sem_post(&sem3); 
    } 
} 

void* f3(void*) 
{ 
    sem_wait(&sem3); 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    printf("\nF3(): %d", 3);  
    sem_post(&sem1); 
} 
} 

int main() 
{ 
    pthread_t p1, p2, p3; 
    sem_init(&sem1, 0, 1); 
    sem_init(&sem2, 0, 1); 
    sem_init(&sem3, 0, 1); 

    pthread_create(&p1, NULL, f1, (void*)NULL); 
    pthread_create(&p2, NULL, f2, (void*)NULL); 
    pthread_create(&p3, NULL, f3, (void*)NULL); 

    pthread_join(p1, NULL); 
    pthread_join(p2, NULL); 
    pthread_join(p3, NULL); 

    return 0; 

} 
+1

あなたはセマフォのすべてを初期化します同じ方法で、それらをすべて同じ方法で使用します。なぜF1が最初に印刷されると思いますか? –

答えて

2

あなたが他の人とは異なるsem1を初期化する必要があります。

また、各機能がループに入ると、再びsem_waitが呼び出されることはなく、印刷の順序を制御できなくなります。

+0

特に、セマフォー 'sem2'と' sem3'は、セマフォー値0で初期化する必要があります。そのため、関数f2()とf3()は最初は進まないようにします。 'sem1'はメインスレッドが' sem1'に一度だけ投稿し、 'f1()'を初めて実行させるために、対称性と一貫性のためにそのように初期化することもできます。 –

+0

アドバイスをいただきありがとうございます。問題を見つけてコードを修正できました – Nripendra

0

Intialize 0とSEM2とSEM3とコードの下にあるすべてのfunctions.I期待してループ内sem_wait(...)の呼び出しを入れては、期待される結果に123123を与える...

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


#define MAX_NUM 50 
sem_t sem1, sem2, sem3; 

void *f1(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem1); 
    printf("\nF1(): %d", 1); 
    sem_post(&sem2); 
    } 
} 

void *f2(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem2); 
    printf("\nF2(): %d", 2); 
    sem_post(&sem3); 
    } 
} 

void *f3(void* p) 
{ 
    for(int i=1; i<=MAX_NUM; i++) 
    { 
    sem_wait(&sem3); 
    printf("\nF3(): %d", 3); 
    sem_post(&sem1); 
} 
} 


int main() 
{ 
    pthread_t p1, p2, p3; 
    sem_init(&sem1, 0, 1); 
    sem_init(&sem2, 0, 0); 
    sem_init(&sem3, 0, 0); 

    pthread_create(&p1, NULL, f1, (void*)NULL); 
    pthread_create(&p2, NULL, f2, (void*)NULL); 
    pthread_create(&p3, NULL, f3, (void*)NULL); 
    pthread_join(p1, NULL); 
    pthread_join(p2, NULL); 
    pthread_join(p3, NULL); 

    return 0; 

} 
関連する問題