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

28.Синхронізація потоків за „умовними змінними”.

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

Ждущие блокировки — это надстройка над механизмом условных переменных. Функция pthread_cond_wait() аналогично функции pthread_sleepon_wait() освобождает мютекс, ждёт, а затем повторно блокирует мютекс. Основное отличие состоит в том, что библиотека ждущих блокировок имеет скрытый внутренний мютекс, а при использовании условных переменных мютекс передаётся явно. Это даёт больше гибкости, но за распределение условных переменных отвечает программист. Мютексы и условные переменные могут использоваться между потоками как в том же самом, так и в разных процессах, а ждущие блокировки можно применять только между потоками одного и того же процесса.

Рассмотрим программу с использованием condvars:

#include<stdio.h>

#include<pthread.h>

#include<unistd.h>

volatile int flag=0;

pthread_mutex_t mutex=PHTREAD_MUTEX_INITIALIZER;

pthread_cond_t cond=PHTREAD_COND_INITIALIZER;

void * consumer (void * a)

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

while(1)

{ pthread_mutex_lock(&mutex);

while(!flag) pthread_cond_wait(&cond, &mutex);

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

flag=0;

pthread_cond_signal(&cond);

pthread_mutex_signal(&mutex); }}

void * producer(void * a)

{printf(“This is producer\n”);\\производитель

while(1)

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

pthread_mutex_lock(&mutex);

while(flag) pthread_cond_wait(&cond, &mutex);

flag=1;

pthread_cond_signal(&cond);

pthread_mutex_signal(&mutex);

}}

int main()

{ printf(‘Example\n’);

pthread_create(NULL,NULL,producer,NULL);

pthread_create(NULL,NULL,consumer,NULL);

sleep(30);}

Нужно следить за блокировкой мутексов перед к условным переменным, а также применением правильного мутекса для каждой условной переменной и применением правильной условной переменной для каждого мутекса.

Условные переменные надо использовать для точки встречи, а мутексы используются для изменения, а также проверки разделяемых элементов данных.

29.Пули (pool) потоків та їх використання.

Пулы потоков – это несколько потоков, используемых для определенной цели. Обычно можно производить управление потоками в пуле. Потому рассматривают два режима потоков в пуле: режим блокирования и режим обработки.

Основными причинами использования пулов в потоке можно разобрать на наглядном примере: Пусть у нас есть сервер, который работает с клиентами. Когда сервер получит сообщение от клиента, было б не плохо создать еще один поток – и установить его в режим ожидания, на случай получения нового сообщения для обработки. После продолжительной работы сервер накопит много бездействующих потоков, соответственно эти бездействующие потоки надо будет уничтожить, для поддержания работоспособности сервера.

Библиотека для работы в QNX с пулами: <sys/dispach.h>

Существуют следующие в данной библиотеке атрибуты потоков для управления числом потоков:

  1. lo_water – задает min число потоков в режиме блокировки, если число меньше указанного, создается автомат. еще increment потоков.

  2. Increment – соответственно задает сколько еще потоков должно быть создано, если lo_water совпало с числом потоков в режиме ожидания.

  3. hi_water – max число потоков в режиме блокирования, лишние удаляются.

4.maximum – макс. Число потоков, которые могут работать одновременно в пуле потоков.

Указанные параметры размещены в структуре: pthread_pool_attr_t.

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