Студопедия

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

КАТЕГОРИИ:

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






Использование условных переменных для управления отношениями синхронизации






 

Условную переменную можно использовать для реализации отношений синхронизации, о которых упоминалось выше: старт-старт (CC), финиш-старт (ФС), старт-финиш (СФ) и финиш-финиш (ФФ). Эти отношения могут существовать между потоками одного или различных процессов. В листингах 5.4 и 5.5 представлены примеры реализации ФС- и ФФ-отношений синхронизации. В каждом примере определено два мьютекса. Один мьютекс используется для синхронизации доступа к общим данным, а другой — для синхронизации выполнения кода.

// Листинг 5.4. ФС-отношения синхронизации между

// двумя потоками

//...

float Number;

pthread_t ThreadA, ThreadB;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t Event;

void * worker1 (void *X) {

for(int Count = l; Count < 100; Count++){

pthread_mutex_lock(& Mutex);

Number++;

pthread_mutex_unlock(& Mutex);

cout < < «worker1: число равно» < < Number < < endl;

if(Number == 50){

pthread_cond_signal(& Event);

}

}

cout < < «Выполнение функиии worker1 завершено.» < < endl;

return(0);

}

void * worker2 (void *X) {

pthread_mutex_lock(& EventMutex);

pthread_cond_wait(& Event, & EventMutex);

pthread_mutex_unlock(& EventMutex);

for(int Count = 1; Count < 50; Count++){

pthread_mutex_lock(& Mutex);

Number = Number + 20;

pthread_mutex_unlock(& Mutex);

cout < < «worker2: число равно» < < Number < < endl;

}

cout ««Выполнение функции worker2 завершено.» «endl; return(0);

};

int main (int argc, char *argv[]) {

pthread_mutex_init(& Mutex, NULL);

pthread_mutex_init(& EventMutex, NULL);

pthread_cond_init(& Event, NULL);

pthread_create(& ThreadA, NULL, workerl, NULL);

pthread_create(& ThreadB, NULL, worker2, NULL);

//...

return (0);

}

В листинге 5.4 показан пример реализации ФС-отношений синхронизации. Поток ThreadA не может завершиться до тех пор, пока не стартует поток ThreadB. Если значение переменной Number станет равным 50, поток ThreadA сигнализирует о этом потоку ThreadB. Теперь он может продолжать выполнение до самого конца Поток ThreadB не может начать выполнение до тех пор, пока не получит сигнал от потока ThreadA. Поток ThreadB использует объект EventMutex вместе с условной переменной Event. Объект Mutex используется для синхронизации доступа для записи значения разделяемой переменной Number. Для синхронизации различных событий и доступа к критическим разделам задача может использовать несколько мьютексов.

Пример реализации ФФ-отношений синхронизации показан в листинге 5.5.

// Листинг 5.5. ФФ-отношения синхронизации между // двумя потоками

//...

float Number;

pthread_t ThreadA, ThreadB;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t Event;

void *workerl(void *X) {

for(int Count = l; Count < 10; Count++){

pthread_mu tex_l ock (& Mutex);

Number++;

pthread_mutex_unlосk(& Mutex);

cout ««workerl: число равно " < < Number «endl;

}

pthread_mutex_lock(& EventMutex), -

cout ««Функция workerl в состоянии ожидания. " «endl;

pthread_cond_wait (& Event, & EventMutex);

pthread_mutex_unlock(& EventMutex);

return(0);

}

void *worker2 (void *X) {

for(int Count = l; Count < 100; Count++){

pthread_mutex_lock(& Mutex);

Number = Number * 2;

pthread_mutex_unlock(& Mutex);

cout ««worker2: число равно " «Number «endl;

}

pthread_cond_signal (& Event);

cout ««Функция worker2 послала сигнал " «endl; return(0);

}

int main(int argc, char *argv[]) {

pthread_mutex_init (& Mutex, NULL);

pthread_mutex_init (& EventMutex, NULL);

pthread_cond_init (& Event, NULL);

pthread_create(& ThreadA, NULL, workerl, NULL);

pthread_create (& ThreadB, NULL, worker2, NULL);

//...

return (0);

}

В листинге 5.5 поток ThreadA не может завершиться до тех пор, пока не завершится поток ThreadB. Поток ThreadA должен выполнить цикл 10 раз, а ThreadB — 100. Поток ThreadA завершит выполнение своих итераций раньше ThreadB, но будет ожидать до тех пор, пока поток ThreadB не просигналит о своем завершении.

CC- и СФ-отношения синхронизации невозможно реализовать подобным образом. Эти методы используются для синхронизации пор я дка выполнени я процессов.

 


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

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