Ошибка с темами, открывающими файлы - PullRequest
1 голос
/ 28 февраля 2010

Я использую C и pthread на компьютере с Linux, и у меня возникают проблемы с распараллеливанием программы.

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

То, как я это делаю, - это глобальная переменная char **filename, где filename [i] = имя файла данных. В основной функции я буду читать имена файлов всех файлов данных (минус "." И ".."), используя scandir, и помещать их в переменную имени файла. Затем создаются 4 (произвольное число) потока, каждый из которых вызывает функцию Process. В Process () каждый поток только открывается (используя FILE *fin, объявленный в Process ()) и работает с частью файлов данных, используя start_index и end_index. Например, если имеется 100 файлов, то каждый поток будет обрабатывать filename[0] до filename[24], filename[25] до filename[49], filename[50] до filename[74] и filename[75] до filename[99] соответственно. После того, как они сделаны, в main() для всех 4 потоков есть pthread_join.

Я проверил, правильно ли сохранены имена файлов, как в main (), так и в Process (). Тем не менее, я получаю ошибку сегментации здесь, в Process ():

for (i = start_index; i <= end_index ; i++)
   fin = fopen(filename[i], "rb"); <--- Seg fault

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

Пожалуйста, сообщите.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2010

Каковы значения start_index и end_index и, следовательно, i, когда происходит сбой?

Если i находится под контролем, код не должен завершиться сбоем - так что это первое, что я бы проверил.

Фрагмент show code отвратительно пропускает файловые потоки, потому что он перезаписывает fin на каждой итерации. Я предполагаю, что это является артефактом сокращения тестового кода до минимума, а не фактическим поведением (пока еще не работающей) программы.

0 голосов
/ 08 апреля 2011

Это не имеет ничего общего с потоками.

Выполняют ли потоки код перед выделением имени файла? Ваши индексы верны? Если имя файла исходит от scandir ... Вы скопировали имена файлов или просто указали на значение, возвращаемое scandir ..., потому что это значение не является хорошим долгосрочным. Вы указали имя файла [i] на строку в стеке функции, которая вызывает scandir?

Попробуйте использовать strdup, чтобы установить имя файла [i] и посмотреть, сработает ли это.

0 голосов
/ 28 февраля 2010

Я предполагаю, что вы, вероятно, устанавливаете filename[i] на namelist[i]->d_name, а затем вызываете free(3) на namelist[i]. После этого указатель на имя файла недействителен. Или free(3) происходит в основном потоке и гонках с обработкой потоков. Вам действительно нужно strdup(3) каждой строки и освобождать память только после того, как вы действительно с ней покончите.

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

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