Помимо проблем, о которых сказал Джереми , есть еще одна хитрая проблема. Вы не можете гарантировать, что present_file
в потоке совпадает со значением, которое вы установили снаружи. Этот код:
if(strcmp(userInput, "HEAD") == 0){
scanf("%d", &offset);
pthread_create(THREADS + present_file, NULL, tape_reader, (void *) &offset);
n_threads++;
present_file++;
...
}
Вы не знаете, когда поток действительно запускается. Так, например, в 1-й итерации она может начинаться после увеличения present_file
в main
, а во 2-й итерации она начинается до увеличения present_file
.Тогда у вас будет аналогичный present_file
для 2 разных потоков ведущий доступ к одному и тому же файлу .
Несмотря на то, что это очень сложно, и вы можете не увидеть в нормальных условиях, это может произойти,И поскольку вы говорите, что видите эту проблему для большего числа потоков, я думаю, что это будет основной причиной вашей проблемы.
Вы можете использовать блокировку доступа к ее значению, чтобы столкнуться с проблемой.Другой подход, который я лично предпочитаю, заключается в использовании выделенного struct
для передачи как offset
, так и present_file
в поток, используя аргумент.
struct params
{
int present_file;
int offset;
};
...
if(strcmp(userInput, "HEAD") == 0){
scanf("%d", &offset);
struct params *params = calloc(1, sizeof(*params));
params->present_file = present_file;
params->offset = offset;
pthread_create(THREADS + present_file, NULL, tape_reader, (void *) params);
n_threads++;
present_file++;
...
}
просто не забудьте free
params в потоке после считывания значений с него.