Когда ваши темы вводят func
, они оба вызывают fp = fopen("file.txt", "r")
. Это означает, что теоретически вы могли бы на любом этапе чтения файла, когда FILE*
, на который указывает fp
, извлекается из-под потока, который был запущен первым.
Если каждый поток должен прочитать весь файл, тогда вы должны потянуть ваше объявление FILE *fp
туда, где вы открываете файл, чтобы он был локальной переменной. Если вы воспользуетесь этим подходом, убедитесь, что вы закрыли оба FILE*
s.
Если они должны совместно использовать указатель, как он настроен в данный момент, вам нужно безопасно открыть файл. Есть два способа сделать это sh в зависимости от ваших потребностей.
1) Вам следует изменить объявление, чтобы также установить значение NULL
. Затем внутри func
переместите pthread_mutex_lock(&mutex)
вверх над вызовом на fopen()
. Тогда и только звоните fopen()
, если fp == NULL
.
2) Вы также можете переместить ваш вызов на fopen()
на main()
до того, как начнете pthreads. Это делает так, что только один поток должен беспокоиться о том, чтобы открыть файл, и он сбалансирован с вашим вызовом fclose(fp)
, поэтому вы знаете, что fp
является действительным указателем.
Также как сторона обратите внимание, что, как правило, рекомендуется присоединиться ко всем темам. Если вы используете Valgrind, он будет жаловаться на утечку потока 1, так как он не присоединен. Для такого простого случая, как этот, и с тем, как ведут себя ваши потоки, в этом случае это не должно иметь значения, но это хорошая привычка просто получить из get go, если вы изучаете pthreads.