現在、条件変数を使用して 2 つのスレッド (pthreads) を同期させていますが、予期しない動作が発生しています。スレッドが既に条件を待機していることを確認したにもかかわらず、別のスレッドが条件を通知しても復帰しません。
これをデスクトップ環境で実行したことは注目に値するかもしれませんが、これは期待どおりに実行されますが、この問題は、ulibc を使用して組み込み環境でプログラムを実行したときに発生します。
トラブルシューティングを行うために、コードを削除して、ロック/ロック解除/シグナリングを実行する 2 つのスレッドだけにしました。これを次に示します。
#include <stdio.h>
#include <pthread.h>
#include <stdbool.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t condition2 = PTHREAD_COND_INITIALIZER;
bool predicate1 = false;
bool predicate2 = false;
static void * ThreadFunc2(void * arg) {
sleep(1); // For testing purposes, ensures this thread is run after Thread1
pthread_mutex_lock(&mutex2);
while(1) {
pthread_mutex_lock(&mutex1);
// Do some work - Eg receive some data from a socket
predicate1 = false;
pthread_cond_signal(&condition1);
pthread_mutex_unlock(&mutex1);
predicate2 = true;
while(predicate2 == true)
pthread_cond_wait(&condition2, &mutex2);
// Do some more work - Eg send response data to socket
}
}
static void * ThreadFunc1(void * arg) {
int result;
pthread_mutex_lock(&mutex1);
while(1) {
predicate1 = true;
while(predicate1 == true)
pthread_cond_wait(&condition1, &mutex1);
// Do some work - Eg process data on the socket and prepare response data to be sent
pthread_mutex_lock(&mutex2);
predicate2 = false;
pthread_cond_signal(&condition2);
pthread_mutex_unlock(&mutex2);
}
}
int main(int argc, char * argv[]) {
pthread_t thread1Id, thread2Id;
pthread_create(&thread1Id, NULL, ThreadFunc1, NULL);
pthread_create(&thread2Id, NULL, ThreadFunc2, NULL);
while(1) {
sleep(1);
}
return 0;
}
ミューテックス 2/条件 2/述語 2 に関連するすべてのステートメントを除外すると、2 つのスレッドは期待どおりに連携します。
上記のコードでは、しばらくすると (すべての作業が取り除かれるため、各ループが非常に高速に実行されます)、Threadfunc1 の条件 1 の待機は、アプリケーションの停止につながる Threadfunc2 によって通知されても、起きません。
また、デバッグを支援するために、実際の pthread_* 関数を呼び出す前に、一致する行番号で標準出力にメッセージを出力するように pthread_* 関数を再定義しました。これにより、各 pthread 操作の流れをたどり、シグナルがすでに待機状態に送信されていることを確認できました。
上記の実装に存在する可能性のある潜在的な問題に光を当てるのを手伝ってくれる人はいますか?
ご提案いただきありがとうございます。