Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
456.19 Кб
Скачать

27.Алгоритм взаємодії потока-виробника та потока-приймача інформації на основі „чекаючих блокувань”.

Иногда при выполнении синхронизации нам нужно что б поток ожидал некоторого события. Иногда даже два или больше потока могут ожидать данного события, для выполнения такой синхронизации пользуются методом „ждущие блокировки” или „условных переменных”.

Для наглядного примера можно написать такую программу, где один поток является поставщиком данных, а другой потребителем. Для удобства нам нужно ввести переменную flag, которая будет принимать значения 0 если данных нет, или 1 если данные есть. Флаг будет служить для определения наличия данных, а также указания адреса, где происходит синхронизация. В последствии выполнения такой программы мы можем проследить алгоритм взаимодействия между потоком – производителем и потоком – получателем:

#include<stdio.h>

#include<pthread.h>

#include<unistd.h>

volatile int flag=0;

void * consumer (void * not_used)

{printf(“This is consumer\n”); \\потребитель

while(1)

{ pthread_sleepon_lock(); //захват внутреннего мютекса

while(!flag) pthread_sleepon_wait(&flag);

sleep(1); //имитация обработки данных

flag=0; //данных нет

pthread_sleepon_unlock();}}

void * producer(void * not_used){

while(1){ sleep(2); // имитация получения данных

pthread_sleepon_lock();

flag=1; // данные теперь есть

pthread_sleepon_signal(&flag); //посылаем сигнал потоку

pthread_sleepon_unlock();

}}

int main()

{ printf(‘Example\n’);

pthread_create(NULL,NULL,producer,NUUL);

pthread_create(NULL,NULL,consumer,NUUL);

sleep(30);}

№1 – потребитель; №2 – поставщик; Готов – готов к выполнению; Данные – ожидание данных; Флаг – ожидание установки флага; mutex – ожидание освобождения мютекса.

Действие

Владелец

мутекса

№1

№2

№1 блок

mutex

№1

Готов

Данные

№1 провер

флаг

№1

Готов

Данные

№1_wait()

№1

Готов

Данные

Wait

Разблок

Mutex

--

Готов

Данные

Wait блок

На ожид.

--

Флаг

Данные

Пауза

--

Флаг

Данные

Получка

Данных

--

Флаг

Готов

№2 блок

mutex

№2

Флаг

Готов

№2 устан.

Флаг=1

№2

Флаг

Готов

№2_signal

№2

Флаг

Готов

№1 ждет

Mutex

№2

Mutex

Готов

№2

Разблок

Mutex

--

Mutex

Готов

№1 получ.

Mutex

№1

Готов

Готов

№1 обраб.

Данные

№1

Готов

Готов

№1 обраб.

Данные

№1

Готов

Данные

№1 обраб.

Данные

№1

Готов

Данные

№1

разблок.

Mutex

--

Готов

Данные

1-я строка

№1

Готов

Данные

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]