Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Использование мьютексных семафоров для управления критическими разделами






 

Мьютексы используются для управления критическими разделами процессов и потоков, чтобы предотвратить возникновение условий «гонок». Мьютексы позволяют избежать условий «гонок», реализуя последовательный доступ к критическому разделу. Рассмотрим код листинга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. Критические разделы этих процессов могут содержать некоторые ресурсы, разделяемые обоими процессами.

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал