2017-10-18 5 views
0

私は三つの整数(a、bおよびc)、と私は一貫性のある結果を維持するために、この特定の順序でそれらにアクセスするために2つのスレッド(POSIXのpthreadsの)を作成したいと思います:pthreadシグナルを別のものにして実行を続ける方法はありますか?

Thread 1 | Thread 2 
--------------------- 
a=1   b=5 
c=7 
      c=c+10 
      b=a+c*2 
a=b+b*10 

ことをis、c = c + 10 in thread2 thread1でc = 7になるまで待たなければなりません。また、thread1のa = b + b * 10は、thread2のb = a + c * 2が終了するまで待たなければなりません。

私はミューテックスを使用しようとしましたが、意図したとおりに動作しません(下記のコード)。 thread2が最初に起動すると、thread1がロックする前にmutex1をロックすることができ、シーケンシングは失われます。 mutexをメインスレッドからロックすることは、未定義の動作(mutexをロックした後に別のスレッドによってアンロック)が発生するため、オプションではありません。私も条件変数を使ってみましたが、似たような問題が発生します。関連する待機の前にシグナルが発生する可能性があります。

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

int a, b, c; 
pthread_mutex_t mutex1, mutex2 = PTHREAD_MUTEX_INITIALIZER; 

void *thread1(void *arg) { 
    pthread_mutex_lock(&mutex1); 
    a = 1; 
    c = 7; 
    pthread_mutex_unlock(&mutex1); 
    pthread_mutex_lock(&mutex2); 
    a = b + b*10; 
    pthread_exit(NULL); 
} 

void *thread2(void *arg) { 
    pthread_mutex_lock(&mutex2); 
    b = 5; 
    pthread_mutex_lock(&mutex1); 
    c = c + 10; 
    b = a + c*2; 
    pthread_mutex_unlock(&mutex2); 
    pthread_exit(NULL); 
} 

int main() { 
    pthread_t t1, t2; 

    if(pthread_create(&t1, NULL, thread1, NULL)) { 
     fprintf(stderr, "Error creating Thread 1\n"); 
     return 0; 
    } 
    if(pthread_create(&t2, NULL, thread2, NULL)) { 
     fprintf(stderr, "Error creating Thread 2\n"); 
     return 0; 
    } 

    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 

    return a; 
} 

私の質問は、スレッドシーケンシングを達成する正しい方法は、pthreadsを使用したいのですか?前もって感謝します。

+0

これらの 'int a、b、c;'変数はvolatileではないでしょうか? – Gaurav

+0

@usrここでコードを簡略化しました。実際のコードは並列に実行される大きなチャンクを持っています。 –

+0

深さを調べなくても、1つの同期ジョブの2つのミューテックスが怪しいようです。 – spectras

答えて

0
pthread_mutex_t mutex1, mutex2 = PTHREAD_MUTEX_INITIALIZER 

2番目のもののみを初期化します。しかしそれは一種です。 mutex1が初期化されていないため、実行しているシステムによっては、mutex1が初期化されていない可能性があるため、初期化定数が0になる可能性があります。

シグナル/待ち時間の問題はありません問題 - あなたはこのパターンでは、ミューテックスで保護された条件に待つ:

lock(); 
while (check() == false) { 
    wait(); 
} 
func(); 
signal(); 
unlock(); 

ので、スレッド1のチェックが本当だろう、とスレッド2のチェックは次のようになりながら、funcは、C = 7 だろう(C言語== 7 )そしてfuncはc + = 10となるでしょう

関連する問題