マスター スレッドを最近開始した子スレッドに同期するのに問題があります。
私がやりたいことは次のとおりです。
- マスタースレッドは新しい子スレッドを作成してブロックします
- 子スレッドの開始と初期化 (時間がかかる場合があります)
- 子スレッドが初期化されると、メイン スレッドが続行されます (そして 2 つのスレッドが並行して実行されます)。
私の最初の試みは次のようなものでした:
typedef struct threaddata_ {
int running;
} threaddata_t;
void*child_thread(void*arg) {
threaddata_t*x=(threaddata_t)arg;
/* ... INITIALIZE ... */
x->running=1; /* signal that we are running */
/* CHILD THREAD BODY */
return 0;
}
void start_thread(void) {
threaddata_t*x=(threaddata_t*)malloc(sizeof(threaddata_t));
x->running=0;
int result=pthread_create(&threadid, 0, child_thread, &running);
while(!x->running) usleep(100); /* wait till child is initialized */
/* MAIN THREAD BODY */
}
メインスレッドをおそらく必要以上に長くスリープさせるので、私はこれがまったく好きではありませんでした。そこで、ミューテックスと条件を使用して、2回目の試行を行いました
typedef struct threaddata_ {
pthread_mutex_t x_mutex;
pthread_cond_t x_cond;
} threaddata_t;
void*child_thread(void*arg) {
threaddata_t*x=(threaddata_t)arg;
/* ... INITIALIZE ... */
pthread_cond_signal(&x->x_cond); /* signal that we are running */
/* CHILD THREAD BODY */
return 0;
}
void start_thread(void) {
threaddata_t*x=(threaddata_t*)malloc(sizeof(threaddata_t));
pthread_mutex_init(&x->x_mutex, 0);
pthread_cond_init (&x->x_cond , 0);
pthread_mutex_lock(&x->x_mutex);
int result=pthread_create(&threadid, 0, child_thread, &running);
if(!result)pthread_cond_wait(&x->x_cond, &x->x_mutex);
pthread_mutex_unlock(&x->x_mutex);
/* MAIN THREAD BODY */
}
これは最初の試行 (独自の待機ループをローリングするのではなく、適切なシグナルを使用) よりも正気のように見えましたが、これには競合状態が含まれていることがわかりました。状態)、メインスレッドをデッドロックします。
私のケースはそれほど珍しくないので、本当に簡単な解決策があるはずですが、今のところわかりません。