2

thread1 と thread2 を作成するための 2 つのスレッドがあります。スレッドを作成する場合:

pthread_create(&thread1, NULL, &function_th1, NULL);
pthread_create(&thread2, NULL, &function_th2, NULL);

スレッド 2 はスレッド 1 の前に起動され、スレッド 2 の前にスレッド 1 を開始するソリューションを探しています。

この解決策を探していません:

pthread_create(&thread2, NULL, &function_th2, NULL);
pthread_create(&thread1, NULL, &function_th1, NULL);
4

3 に答える 3

5

スレッド作成呼び出しが発行されたときと、スレッドが実際に実行を開始したときとの間には関係がありません。それはすべて実装、OS などに依存します。そのため、一見ランダムな順序で 2 つのスレッドが実際に開始されています。

スレッド 1 をスレッド 2 の前に開始する必要がある場合は、何らかのイベントにデータ/論理的な依存関係がある可能性があります。この場合、条件変数を使用して、実際にいつ実行を開始するかをスレッド 2 に通知する必要があります。

// condition variable
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// associated mutex
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// state for condition variable
int shouldWait = 1;

...

void* function_th1(void* p) {
     // execute something

     // signal thread 2 to proceed
     pthread_mutex_lock(&mutex);
     shouldWait = 0;
     pthread_cond_signal(&cond);
     pthread_mutex_unlock(&mutex);

     // other stuff
}

void* function_th2(void* p) {
     // wait for signal from thread 1
     pthread_mutex_lock(&mutex);
     while(shouldWait) {
         pthread_cond_wait(&cond, &mutex);
     }
     pthread_mutex_unlock(&mutex);

     // other stuff
}    
于 2012-05-16T10:13:44.940 に答える
3

「pthread_create(&thread2, NULL, &function_th2, NULL);」を移動します。「function_th1」関数の先頭に。

それは確かにあなたが求めるものを達成し、複雑なシグナリングは必要ありません.

あなたが求めるものが実際に欲しいものか必要なものかは別問題です。

于 2012-05-16T11:56:42.920 に答える
1

ここで私が提案する解決策の後

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

static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static bool wait = TRUE;

void thread_sync() {
  pthread_mutex_lock(&mut);
  wait = FALSE;
  pthread_cond_signal(&cond);
  pthread_mutex_unlock(&mut);
}
void thread_wait_sync() {
  pthread_mutex_lock(&mut);
  if (wait==TRUE)
  {
      pthread_cond_wait(&cond,&mut);
  }
  wait = TRUE;
  pthread_mutex_unlock(&mut);
}

void *thread1(void *d) {
  thread_sync();
  while (1); // Rest of work happens whenever
  return NULL;
}

void *thread2(void *d) {
  thread_sync();
  while (1);
  return NULL;
}

void *thread3(void *d) {
  thread_sync();
  while (1);
  return NULL;
}

void *thread4(void *d) {
  while (1);
  return NULL;
}

int main() {
  pthread_t t1,t2,t3,t4;
  pthread_create(&t1, NULL, thread1, NULL);
  thread_wait_sync();
  pthread_create(&t2, NULL, thread2, NULL);
  thread_wait_sync();
  pthread_create(&t3, NULL, thread3, NULL);
  thread_wait_sync();
  pthread_create(&t4, NULL, thread4, NULL);
  while(1) {
    // some work
  }
}
于 2012-05-16T17:24:11.940 に答える