Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Использование мьютексных семафоров для управления критическими разделами
Мьютексы используются для управления критическими разделами процессов и потоков, чтобы предотвратить возникновение условий «гонок». Мьютексы позволяют избежать условий «гонок», реализуя последовательный доступ к критическому разделу. Рассмотрим код листинга5.1. В нем демонстрируется выполнение двух потоков. Для защиты их критических разделов и используются мьютексы. // Листинг 5.1. Использование мьютексов для защиты // критических разделов потоков //... pthread_t ThreadA, ThreadB; pthread_mutex_t Mutex, -pthread_mutexattr_t MutexAttr; void *task1(void *X) { pthread_mutex_lock(& Mutex); // Критический раздел кода. pthread_mutex_unlock(& Mutex); return(0); } void *task2 (void *X) { pthread_mutex_lock(& Mutex); // Критический раздел кода. pthread_mutex_unlосk (& Mu t ex); return(0); } int main(void) { //... pthread_mutexattr_init (& MutexAttr); pthread_mutex_init (& Mutex, & MutexAttr); //Устанавливаем атрибуты мьютекса. pthread_create(& ThreadA, NULL, taskl, NULL); pthread_create(& ThreadB, NULL, task2, NULL); //... return(0); } В листинге 5.1 потоки ThreadA и ThreadB содержат критические разделы, защищаемые с помощью объекта Mutex. В листинге 5.2 демонстрируется, как можно использовать мьютексы для защиты критических разделов процессов. // Листинг 5.2. Использование мьютексов для зашиты // критических разделов процессов //... int Rt; pthread_mutex_t Mutexl; pthread_mutexattr_t MutexAttr; int main(void) { //... pthread_mutexattr_init (& MutexAttr); pthread_mutexattr_setpshared( & MutexAttr, PTHREAD_PROCESS_SHARED); pthread_mutex_init (& Mutexl, & MutexAttr); if((Rt = fork()) == 0){ // Сыновний процесс. pthread_mutex_lock(& Mutexl); // Критический раздел. pthread_mutex_unlock(& Mutexl); } else{ // Родительский процесс, pthread_mutex_lock(& Mutexl); // Критический раздел. pthread_mutex_unlock(& Mutexl); } //... return(0); }
Рис. 5.5. Закрытые и разделяемые мьютексы Важно отметить, что в листинге 5.2 при вызове следующей функции мьютекс инициализируется как разделяемый: pthread_mutexattr_setpshared(& MutexAttr, PTHREAD_PROCESS_SHARED); Установка этого атрибута равным значению PTHREAD_PROCESS_SHARED позволяет объекту Mutex стать разделяемым между потоками различных процессов. После вызова функции fork () сыновний и родительский процессы могут защищать свои критические разделы с помощью объекта Mutex. Критические разделы этих процессов могут содержать некоторые ресурсы, разделяемые обоими процессами.
|