C - Сбой программы или не реагирует на использование мьютекса

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

предварительные условия:

никакие глобальные блокировки, к которым физическая файловая система не должна быть тронута, должны использоваться для использования forks/shm или pthreads.

Я хотя бы о следующей концепции:

Я использую prthreads. Новый поток создается с каждым подключаемым клиентом.

Я создал структуру для имитации файлов:

struct _sFile {
 char *filename;
 size_t size;
 char *content;
 char *location;
 sFile *next;
 pthread_mutex_t *mutex;
};

в качестве файловой системы используется связанный список sFile. Не нужно учитывать каталоги

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

Я написал несколько функций для итерации по списку:

void iterator_init(iterator *it){
 pthread_mutex_init(it->a->mutex,NULL);
 pthread_mutex_init(it->b->mutex,NULL);
 it->a=NULL;
 it->b=file_list;
 pthread_mutex_lock(it->b->mutex);
}

/*
 * Return the next file in the list or null if at the end.
 * If the end is reached, the iterator is already destoryed.
 */
sFile *iterator_next(iterator *it){
 if (it->a != NULL)
 pthread_mutex_unlock(it->a->mutex);
 if (it->b->next==NULL)
 {
 pthread_mutex_unlock(it->b->mutex);
 return NULL;
 }

 it->a=it->b;
 it->b=it->b->next;
 pthread_mutex_lock(it->b->mutex);
 return it->b;
}

void iterator_destroy(iterator *it){
 if (it->a != NULL)
 pthread_mutex_unlock(it->a->mutex);
 if (it->b != NULL)
 pthread_mutex_unlock(it->b->mutex);
}

Я попытался поместить блокировку в файл, когда мой клиент запускает команду LIST. Это моя команда списка:

void cmd_list(int ac, char *av) {
 iterator it;
 iterator_init(&it);
 sFile *list = file_list;
 long num_files = file_count;
 char ack[32];
 sprintf(ack, "ACK %d\n", file_count);
 send(client_sock, ack, (int) strlen(ack), 0);
 sFile *current = list;
 while ((current=iterator_next(&it))!=NULL){
 send(client_sock, current->filename, strlen(current->filename), 0);
}

}

Но приложение падает на

interator_init(&it)

в функции cmd_create.

Что я делаю не так? Иногда блокировка работает, но клиент ждет бесконечно, и команда отправляется на сервер, если клиент не останавливается.

Исходный код всего приложения включен

https://github.com/fish-guts/concurrent

Любые намеки будут оценены.

С уважением

1 ответ

Перед тем, как использовать его, необходимо инициализировать мьютекс с помощью pthread_mutex_init(). iterator_init() пытается заблокировать мьютекс в структуре, которую он получает как параметр без его инициализации.

licensed under cc by-sa 3.0 with attribution.