2015-12-03 6 views
-1

Я экспериментирую с параллельным программированием на C с помощью Codeblocks IDE с gcc. Когда я запускаю свою программу, я не получаю выход. Интересно, однако, что, когда я ставлю точку прерывания в определенный момент в программе, программа выполнит все инструкции (включая вывод значений в консоль) до этой точки. Однако после этого, если я попытаюсь выполнить команду srand(time(NULL)), все переменные, которые я просматриваю, сразу показывают «Ошибка чтения переменной, не могут получить доступ к памяти по адресу X», и процесс отладки завершается.Ошибка чтения переменной (не может получить доступ к памяти по адресу), возникающей при вызове srand()

Вот моя основная функция()

/*main function*/ 
int main() 
{ 
int k = 3; 
int m = 100; 
int n = 10; 
int t = 10; 

/*First, let's create the threads*/ 
pthread_t thread[numOfThreads]; 

/*Second, create the data struct*/ 
struct programData *data = malloc(sizeof(struct programData)); 

/*Initialize data struct*/ 
data->kPumps=k; 
data->mVisitors=m; 
data->nCars=n; 
data->tTime=t; /*They'll drive visitor around for 10 units of time.*/ 

/*Now let's create the different threads*/ 
pthread_create(&thread[0], NULL, visitorThread, (void*)data); 
pthread_create(&thread[1], NULL, carThread, (void*)data); 
pthread_create(&thread[2], NULL, pumpThread, (void*)data); 
pthread_create(&thread[3], NULL, gasTruck, (void*)data); 

return 0; 
} 

И мой посетитель нить

void *visitorThread(void *arg){ 
int arrayIndex; 
int i; 
/*Let's create mVisitors*/ 
struct programData *data; 
data = (struct programData*)arg; 
int numOfVisitors; 
numOfVisitors = data->mVisitors; 
/*create an array of visitors*/ 
struct visitor v[numOfVisitors]; 

/*Initialize values*/ 
for(i = 0; i < numOfVisitors; i++){ 
    v[i].id = i+1; 
    v[i].isInCar = false; 
    v[i].isInQueue = false; 
} 

printf("There are %d visitors at the San Diego Zoo \n", numOfVisitors); 
printf("At first the visitors wait at the snake exhibit \n"); 
//sleep(5); 
printf("Now some of them are getting bored, and want to get into a car to be shown the rest of the zoo \n"); 

/*After a random amount of time, some people line up to take cars*/ 
/*create queue*/ 
struct visitor* queue[numOfVisitors]; 
/*Initialize the array*/ 
for(i = 0; i < numOfVisitors; i++){ 
    queue[i] = NULL; 
} 

arrayIndex = 0; 

/*While there are people in the snake exhibit*/ 
while(numOfVisitors >=1){ 
    /*After a random period of time, no more than 5 seconds...*/ 
//srand 
    srand(time(NULL)); 
    int timeBeforePersonLeaves = rand()%5+1; 
    //fflush(stdout); 
    //sleep(timeBeforePersonLeaves); 
    /*...a random person will get bored and enter the array line to be picked up by a car*/ 
    srand(time(NULL)); 
    int personIndex = rand() % numOfVisitors; 
    queue[arrayIndex] = &v[personIndex]; 
    v[personIndex].isInQueue = true; 
    printf("Visitor %d is now in queue spot %d \n", personIndex, arrayIndex); 
    arrayIndex++; 
} 
return; 
} 

Проблема, кажется, существует в пределах цикла. Если я поставлю точку останова в скобке в конце цикла while, она выведет каждое значение. Однако, если поставить точку останова в пределах цикла while, как только он достигнет вызова srand, это приведет к той же проблеме. Любая помощь в этом отношении была бы оценена, и спасибо заранее.

+2

'while (numOfVisitors> = 1)'. У вас бесконечный цикл. Результаты в 'arrayIndex' постоянно растут и переполняют« очередь ». Также прочитайте [man page srand] (http://linux.die.net/man/3/srand). Вам нужно позвонить только один раз не постоянно. – kaylum

+0

вызов srand однажды, похоже, устранил проблему. Благодаря! – Johnny

+0

К сожалению, я сомневаюсь, что это устранило бы вашу основную проблему. Возможно, это переместило проблему, чтобы она не запускалась в ваших текущих тестовых прогонах (обычное явление с многопоточными приложениями). Но если вы не устраните основные проблемы (такие как цикл бесконечности), проблемы снова укусят вас в любое время. – kaylum

ответ

0

while(numOfVisitors >=1). У вас бесконечный цикл. Результаты в arrayIndex постоянно растут и переполняются queue. Также прочитайте страницу man для srand. Вам нужно позвонить только один раз не постоянно. –   kaylum