неожиданный прирост числа в многопоточной программе - PullRequest
2 голосов
/ 06 февраля 2020

Я пытаюсь запустить заданное количество завитков от каждого потока. pull_one_url() - это функция, которая вызывается в pthread_create() из main(). cnt_limit - это глобальная переменная, которая установлена ​​в main и доступна только для чтения в потоках.

Неожиданное поведение, которое я иногда наблюдаю, заключается в том, что локальная переменная count увеличивается до высоких значений.

Для заданного числа прогонов было 10 и cnt_limit (количество скручиваний из каждого потока ) установлен на 10.

Выполнение командной строки: ./a.out 10 10 10.140.71.12

Неожиданный вывод:

10 2682
10 2858
10 2804
10 2988
10 2871
10 2940
10 2864
10 2609
10 2816
10 2893

ожидаемый вывод: для заданного ввода необходимо выполнить каждые 10 потоков 10 запросов скручивания.

количество строк = количество потоков

первое число в каждой строке = количество запросов скручивания, которые требуется выполнить каждому потоку.

второе число в каждой строке = количество запросов curl, выполненных каждым потоком

Отредактировано: после комментирования кода libcurl, присутствующего внутри l oop, я пока не наблюдаю такого поведения. Но ранее наблюдаемое неожиданное поведение также было не очень последовательным. Остается вопрос, как этот код libcurl влияет на простой счетчик в l oop.

Потратив много времени, пытаясь понять это, я публикую это здесь. Я думаю, что я делаю какую-то глупую ошибку. Любая помощь будет оценена.

1 Ответ

3 голосов
/ 07 февраля 2020

Судя по результатам обсуждения в разделе комментариев, проблема заключалась в следующем:

Часть кода, которую опубликовал ОП, была следующей:

int response_code;
[...]
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);

Согласно документации curl для CURLINFO_RESPONSE_CODE , последний параметр имеет тип long *. Однако OP передает параметр типа int *. Поскольку OP использует платформу, на которой sizeof(long) == 8, тогда как sizeof(int) == 4, библиотека curl записала 8 байтов по адресу response_code, хотя для этой переменной в стеке было выделено только 4 байта. Вероятно, это вызвало перезапись соседней переменной в стеке.

Чтобы устранить эту проблему, строку

int response_code;

следует изменить на:

long response_code;

...