При наличии всех потоков передается указатель на одни и те же данные, и fgets
будет перезаписывать эти данные при каждом вызове. Таким образом, ваш вывод будет немного случайным и, возможно, поврежденным.
Вы можете передать копию прочитанной строки каждому потоку, и каждый поток освободит ее (например).
while (fgets(...))
pthread_create(..., (void*)strdup(line));
В процедуре потока вы должны проверить, что переданные данные не равны нулю (это может произойти, если strdup
не удалось выделить достаточно памяти для копии), и добавить:
free(data);
как только вы закончите с ним работать.
Наличие отдельного (статического) буфера для каждого потока тоже будет работать, но вам нужно будет заранее знать, сколько вы собираетесь запустить (или выполнить некоторые динамические перераспределения или что-то в этом роде).