2012-06-15 2 views
5

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

Релевантная информация: программа имеет main.c, где мы определяем конкретное действие в соответствии с пользовательским вводом. main вызывает функцию master_function, которая находится в файле с именем master.c. В файле master.c мы создаем N потоков по некоторым другим действиям (не относится). В потоках вызывается функция с именем son_threads, которая находится в файле son.c, и им необходимо использовать мьютекс, когда они входят, вводят критический регион (редактирование нескольких глобальных переменных для предотвращения состояния гонки). Другой файл, который у меня есть, - это type.h, где я определяю несколько глобальных переменных, которые мне нужно использовать.

Декларация мьютекс:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

Так что я попытался определить мьютекс в моем type.h так что видны son.c файлы. Когда я пытаюсь скомпилировать, это дает мне ошибку. Это правильно, так как я определяю этот мьютекс в нескольких файлах.

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

Мьютекс должен быть глобальной переменной, в которой потоки N имеют к ней доступ. Итак, где я должен это сказать?

Я не знаю, правильно ли объясняю себя. Стараюсь изо всех сил.

ответ

6

Просто объявить переменную в файле .h

extern pthread_mutex_t mutex1; 

и держать определение с инициализацией в файле C. Это так, как это понимается по стандарту C.

Для POSIX инициализация мьютекса со статическим хранилищем действительно важна. Так что определение не может жить в файле .h.

1

Если вы должны иметь глобальную переменную и делиться ею между модулями в 'C', я считаю, что это типично для объявления в включенном файле. В старые времена мы использовали бы какой-то волшебный макрос вроде «GLOBAL» в файле .h как «extern», и в основном мы бы переопределили GLOBAL как ничего такого, что он был бы объявлен в основном.

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

Хорошо, я понимаю, что вы имеете в виду. Позвольте мне посмотреть, как это получается. Спасибо за совет! – Alessandroempire

+0

Я не думаю, что игра с 'GLOBAL' здесь много. Вам нужно объявление в файле '.h' и определение * с инициализацией * в' .c'. Инициализация по умолчанию для 'pthread_mutex_t' не будет выполняться. –

+0

@JensGustedt это именно то, что я только что сделал, и это сработало. Я не заметил, что я инициализировал мьютекс в файле .h. Огромная ошибка. – Alessandroempire

2

Но я уверен, что я не могу определить мьютекс в файле son.c, потому что каждый раз, когда я создаю эту нить, мьютекс инициализируется значение по умолчанию, не позволяет мне использовать его правильно , Не уверен в этом.

Неправильное использование. Поместите определение мьютекса в этот файл, но вне функции потока. Он будет инициализирован при запуске программы, но не в каждом новом потоке. Вы можете поместить extern pthread_mutex_t mutex1; в один из файлов заголовков, чтобы любые пользователи мьютексов, которые не находятся в son.c, знают о мьютексе.

+0

Это было мое сомнение! Я думал каждый раз, когда я создаю новый поток, он просто сбросит мьютекс. Ну, это хорошие новости. Большое спасибо! – Alessandroempire

Смежные вопросы