Вы получаете одну и ту же последовательность случайных чисел в каждом процессе, потому что вы заполняете PRNG перед вызовом fork()
.После вызова fork()
каждый процесс имеет свою собственную копию PRNG с одинаковым значением, поэтому каждый процесс получает одинаковую последовательность чисел.
Обратите внимание, чтовызовы мьютекса не нужны, потому что после fork()
каждый процесс работает в своем собственном виртуальном адресном пространстве - здесь нет общего состояния между процессами.
Если вы используете pthread_create()
вместо fork()
,создавая отдельные потоков , потоки будут совместно использовать состояние PRNG, и каждый из них получит различное значение из последовательности PRNG:
void *thread_func(void *arg)
{
double d;
if (!nextRandomDouble(&d))
fprintf(stderr, "PRNG failed.\n");
else
printf("rnd: %f\n", d);
return 0;
}
int main()
{
const int processes = 5;
pthread_t thread[processes];
srand48(time(NULL));
for(int i = 0; i < processes; ++i)
{
int pthread_err = pthread_create(&thread[i], NULL, thread_func, NULL);
RETURN_FAILURE_IF_TRUE(pthread_err != 0, "pthread_create failed.\n");
}
for(int i = 0; i < processes; ++i)
{
void *status;
int pthread_err = pthread_join(thread[i], &status);
if ((pthread_err != 0) || (status != 0))
fprintf(stderr, "Child exit failed.\n");
}
return EXIT_SUCCESS;
}