2016-12-19 6 views
1

私は4つのスレッドでA、B、C、Dと呼ばれる4つの処理をしています。私はA、B、C、DをA、B、C、Dの順に処理するためにmutexを使用します。これは私のコードですが、私のようには機能しません。彼らはどのように働くのですか?Cでマルチスレッドを使用するには?

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

void processA(); 
void processB(); 
void processC(); 
void processD(); 

pthread_mutex_t mutex; 

void main(){ 
    pthread_t thread1; 
    pthread_t thread2; 
    pthread_t thread3; 
    pthread_t thread4; 

    pthread_mutex_init(&mutex,NULL); 

    pthread_create(&thread1, NULL, (void *)&processA,NULL); 
    pthread_create(&thread2, NULL, (void *)&processB,NULL); 
    pthread_create(&thread3, NULL, (void *)&processC,NULL); 
    pthread_create(&thread4, NULL, (void *)&processD,NULL); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 
    pthread_join(thread3, NULL); 
    pthread_join(thread4, NULL);    

    pthread_mutex_destroy(&mutex); 
} 
void processA() 
{ 
    while (1) 
    { 
     pthread_mutex_lock(&mutex); 
     printf("A \n"); 
     pthread_mutex_unlock(&mutex); 
    } 
} 
void processB() 
{ 
    while (1) 
    { 
     pthread_mutex_lock(&mutex); 
     printf("B \n"); 
     pthread_mutex_unlock(&mutex); 
    } 
} 
void processC() 
{ 
    while (1) 
    { 
     pthread_mutex_lock(&mutex); 
     printf("C \n"); 
     pthread_mutex_unlock(&mutex); 
    } 
} 
void processD() 
{ 
pthread_mutex_lock(&mutex); 
    while (1) 
    { 
     pthread_mutex_lock(&mutex); 
     printf("D \n"); 
     pthread_mutex_unlock(&mutex); 
    } 
} 
+0

あなたは最初に実行されるスレッドの制御権がありません。スレッドを同期させるには、別の方法を見つけ出す必要があります。条件変数は多分?または、複数のミューテックスを使用する必要がある場合はそれを使用しますか? –

+2

プロセスを「順番に」実行したい場合は、スレッドやmutexを必要としません。ミューテックスは、複数のスレッドが同じ場所に書き込むのを防ぐために使用されます。 – DeiDei

+1

無関係な注記: 'void processA();'宣言は引数を取らない関数 'processA'を宣言しません。定義されていない未知数の引数を取る関数を宣言します。 –

答えて

1

mutexは、一部のコンテキストで相互排除を作成するためのものです。たとえば、一度に1つのスレッドが到達すべきオブジェクトがある場合は、mutexを使用できます。

このような機能を実装するには、3 semaphoresを使用する必要があります。あなたは言うことができます:

//semaphore1 = up, semaphore2 = up, semaphore3 = up 
//Thread A 
    //wait for semaphore1 is up 
     //work 
     //make semaphore1 down 
//Thread B 
    //wait for semaphore1 is down 
     //work 
     //make semaphore2 down  
//Thread C 
    //wait for semaphore2 is down 
     //work 
     //make semaphore3 down  
//Thread D 
    //wait for semaphore3 is down 
     //work 
+0

これは、OPがそれを置く文脈では良い答えではありません。セマフォはPOSIXのオプション機能であり、Cのスレッドオプションでは全く存在しません。代わりに、条件変数を使用してください。 (また、POSIXセマフォは、その機能が割り込み可能であるため、正しく処理するのは非常に難しいです。) –

+0

あなたの状態がどうなるのを待っていますか?概念を説明するのが難しくない – cokceken

+0

「どうやって待っていますか? 'pthread_cond_wait'をそれぞれ' cnd_wait'で使用してください。 –

関連する問題