VS rand () проблема с pthread-win32 - PullRequest
1 голос
/ 17 мая 2009

Я сталкиваюсь со странной проблемой в программировании 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 () возвращает один и тот же результат при каждых двух вызовах и у меня есть srand (), но результат не меняется каждый раз, когда я запускаю программу

Я очень новичок в многопоточном программировании, и я слышал, что rand () не является поточно-ориентированным. но я все еще не могу понять, является ли приведенная выше программа неправильной или в функции rand () есть какая-то проблема.

Ответы [ 2 ]

4 голосов
/ 17 мая 2009

rand является только псевдослучайным и будет возвращать одну и ту же последовательность каждый раз. srand работает только в текущем потоке, поэтому вызов его в основном потоке не повлияет на ваши рабочие потоки.

Вам необходимо вызвать srand из каждого потока, со значением, которое отличается для каждого потока - например, в ваших thread1 и thread2 функциях:

srand((int)time(NULL) ^ (int)pthread_getthreadid_np());
1 голос
/ 17 мая 2009

Попробуйте использовать rand_s() вместо этого, это потокобезопасно. Смотрите здесь . Конечно, это не портативно.

...