私は三つの整数(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を使用したいのですか?前もって感謝します。
これらの 'int a、b、c;'変数はvolatileではないでしょうか? – Gaurav
@usrここでコードを簡略化しました。実際のコードは並列に実行される大きなチャンクを持っています。 –
深さを調べなくても、1つの同期ジョブの2つのミューテックスが怪しいようです。 – spectras