Я экспериментирую с параллельным программированием на 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, это приведет к той же проблеме. Любая помощь в этом отношении была бы оценена, и спасибо заранее.
'while (numOfVisitors> = 1)'. У вас бесконечный цикл. Результаты в 'arrayIndex' постоянно растут и переполняют« очередь ». Также прочитайте [man page srand] (http://linux.die.net/man/3/srand). Вам нужно позвонить только один раз не постоянно. – kaylum
вызов srand однажды, похоже, устранил проблему. Благодаря! – Johnny
К сожалению, я сомневаюсь, что это устранило бы вашу основную проблему. Возможно, это переместило проблему, чтобы она не запускалась в ваших текущих тестовых прогонах (обычное явление с многопоточными приложениями). Но если вы не устраните основные проблемы (такие как цикл бесконечности), проблемы снова укусят вас в любое время. – kaylum