1

pthread プログラミングで奇妙な問題が発生しました。vs2005 でpthread-w32を使用して次のコードをコンパイルしました。

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <pthread.h>
#include <windows.h>

pthread_mutex_t lock;

void* thread1(void *) {
  int r1;
  while(true) {
    pthread_mutex_lock(&lock); // rand is maybe a CS
    r1 = rand() % 1500;
    pthread_mutex_unlock(&lock);
    Sleep(r1); printf("1:%d\n", r1);
  }
  return NULL;
}

void* thread2(void *) {
  int r2;
  while(true) {
    pthread_mutex_lock(&lock);
    r2 = rand() % 1500;
    pthread_mutex_unlock(&lock);
    Sleep(r2); printf("2:%d\n", r2);
  }
  return NULL;
}

int main() {
  srand((int)time(NULL));
  pthread_mutex_init(&lock, NULL);

  pthread_t tc_p, tc_v;
  pthread_create(&tc_p, NULL, thread1, NULL);
  pthread_create(&tc_v, NULL, thread2, NULL);

  pthread_join(tc_p, NULL);
  pthread_join(tc_v, NULL);

  pthread_mutex_destroy(&lock);

    return 0;
}

出力は次のようになります

2:41
1:41
1:467
2:467
1:334
2:334
1:1000
2:1000

rand() が 2 回の呼び出しごとに同じ結果を返すのと同じように、srand() がありますが、プログラムを実行するたびに結果は変わりません

私はマルチ スレッド プログラミングに非常に慣れていないので、rand() がスレッド セーフではないことを聞いたことがあります。しかし、上記のプログラムが間違っているのか、それとも rand() 関数に問題があるのか​​ 、まだわかりません。

4

2 に答える 2

5

rand疑似乱数のみであり、毎回同じシーケンスを返します。 srand現在のスレッドでのみ機能するため、メイン スレッドで呼び出してもワーカー スレッドには影響しません。

srandスレッドごとに異なる値を使用して、各スレッド内から呼び出す必要があります-たとえば、 thread1andthread2関数内:

srand((int)time(NULL) ^ (int)pthread_getthreadid_np());
于 2009-05-17T06:15:16.090 に答える
1

代わりに使用してみてくださいrand_s()。スレッドセーフです。ここを参照してください。もちろん、携帯用ではありません。

于 2009-05-17T06:15:26.963 に答える