2017-01-19 14 views
0

Im пытается создать многопроцессорную программу в c. основной процесс запустит 3 процесса, каждый из которых выполнит свою работу (спящий на 1-10 секунд) и сообщит, что он сделан. Проблема im сталкивается с тем, чтобы генерировать случайные числа. Я всегда получаю одинаковые числа (рандомизированный между каждым запуском, но постоянный между всеми разветвленными процессами. Является ли это ошибкой? (im new to 'c') Является ли это поведение разветвленного процесса? Если это так, как я могу сгенерировать случайные числаГенерировать случайные числа на разветвленных процессах в c

#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <stdlib.h> 

int main(int argc, char **argv){ 
    // srand(time(NULL)); 
    printf("starting main proc [%d]\n", getpid()); 
    // start 3 processes 
    for (int i=0; i<3; i++){ 
     exec_waiting_proc(i); 
    } 
    return 0; 
} 
// sleeper process 
int exec_waiting_proc(int id){ 
    int pid; 
    pid = fork(); 
    if (pid == 0){ 
    // child 
     srand(time(NULL)); 
     int parent_id = getppid(); 
     int sleep_seconds = (rand() % 10) + 1; 
     printf("%d\n", sleep_seconds); 
     //sleep(r); 
     printf("child-%d [%d], done... my parent: [%d]\n", id, getpid(), parent_id); 
     _exit(0); 
    } else { 
    // parent 
     printf("parent [%d]: starting process %d\n", getpid(), pid); 
    } 
    return 0; 
} 

выход? Например: (2 раза)

chen ~/dev/c/geany/ ./ptr2 
starting main proc [25801] 
parent [25801]: starting process 25802 
parent [25801]: starting process 25803 
8 
child-0 [25802], done... my parent: [25801] 
parent [25801]: starting process 25804 
8 
child-1 [25803], done... my parent: [25801] 
8 
child-2 [25804], done... my parent: [3077] 
chen ~/dev/c/geany/ 
chen ~/dev/c/geany/ 
chen ~/dev/c/geany/ ./ptr2 
starting main proc [25805] 
parent [25805]: starting process 25806 
parent [25805]: starting process 25807 
parent [25805]: starting process 25808 
7 
child-0 [25806], done... my parent: [25805] 
7 
child-1 [25807], done... my parent: [25805] 
7 
child-2 [25808], done... my parent: [3077] 
chen ~/dev/c/geany/ 
+0

Дублированный [вопрос?] (Http://stackoverflow.com/questions/6161322/using-stdlibs-rand-from-multiple-threads) Принятый ответ говорит: «Функция« rand() 'не является реентерабельной или потокобезопасной». –

+1

@weathervane, что вопрос о потоках. Это касается разветвленных процессов, которые не разделяют память. – rici

+0

@Vane, спасибо за ваш ответ. его не о потоках, а о поведении процессов разветвления, которые имеют полный клон родительского процесса. – chenchuk

ответ

2

Как компьютеры работают ужасно быстро возвращает значение time(NULL) собирается (более или вероятно) будет одинаковым для каждого процесса Попробуйте.

time(NULL)^getpid() 

для инициализации генератора случайных чисел.

Другие варианты включают использование времени, измеренного в наносекунд

+0

/dev/urandom также является хорошим вариантом, если он у вас есть. – rici

+0

@Ed, thenks для вашего ответа. можно объяснить формулу? это означает что-то во власти ПИД-регулятора? что означает, что вы полагаетесь на сам PID как семя для рандомизации? – chenchuk

 Смежные вопросы

  • Нет связанных вопросов^_^