Темы для петель - PullRequest
       14

Темы для петель

1 голос
/ 20 мая 2011

Я пишу программу на C для расчета времени доступа к определенным веб-сайтам. Ситуации хранятся в каждом элементе массива urls. Если я возьму цикл for (y = 0; y

Что вызывает это?

char *urls[50]; char str1[20];

void *wget(void *argument)
{
  int threadid;
  threadid = *((int *)argument);
  strcpy(str1, "wget -q --spider ");
  strcat(str1, urls[threadid]);
  system(str1);
}


for (y = 0; y < iterations; y++)
{
  for (j = 0; j < numthreads; j++)
  {
        thread_args[j] = j;

        clock_gettime(CLOCK_REALTIME, &bgn);
        rc = pthread_create(&threads[j], NULL, wget, (void *) &thread_args[j]);
        rc = pthread_join(threads[j], NULL);
        clock_gettime(CLOCK_REALTIME, &nd);
        times[j] = timediff(bgn,nd);
  }
}

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Некоторые возможности ...

str1, кажется, распределяется между всеми потоками.Это рецепт для неприятностей прямо здесь.

str1 только 20 символов.Трудно поверить, что вся командная строка wget, включая URL, будет содержать менее 20 символов.Итак, вы записываете конец str1.

Попробуйте сделать str1 локальной переменной в wget() и либо сделать массив массивов, достаточно большой для обработки максимально возможной команды wgetстрока, которую вы можете иметь, или динамически выделить ее и освободить в пределах wget() с размером, основанным на длине постоянной части командной строки и текущем URL.

3 голосов
/ 20 мая 2011

Моя ставка в том, что одна из строк в urls + строка wget длиннее 20 байтов и перезаписывает эти данные.Увеличьте str1 и переместите его в функцию wget (несколько потоков не должны писать в один общий ресурс без блокировки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...