рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Взаимоисключения

Взаимоисключения - раздел Компьютеры, Синхронизация нитей внутри процесса в ОС Windows Объекты-Взаимоисключения (Мьютексы, Mutex - От Mutual Exclusion) Позволяют Ко...

Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние "установлен") соответствует моменту времени, когда объект не принадлежит ни одной нити и его можно "захватить". И наоборот, состояние "сброшен" (не сигнальное) соответствует моменту, когда какая-либо нить уже владеет этим объектом. Доступ к объекту разрешается, когда нить, владеющая объектом, освободит его.

Две (или более) нити могут создать мьютекс с одним и тем же именем, вызвав функцию CreateMutex. Первая нить действительно создает мьютекс, а следующие - получают дескриптор уже существующего объекта. Это дает возможность нескольким нитям получить дескриптор одного и того же мьютекса, освобождая программиста от необходимости заботиться о том, кто в действительности создает мьютекс. Если используется такой подход, желательно установить флаг bInitialOwner в FALSE, иначе возникнут определенные трудности при определении действительного создателя мьютекса.

Несколько нитей могут получить дескриптор одного и того же мьютекса, что делает возможным взаимодействие между процессами. Можно использовать следующие механизмы такого подхода:

  • Дочерний процесс, созданный при помощи функции CreateProcess может наследовать дескриптор мьютекса в случае, если при создании мьютекса функцией CreateMutex был указан параметр lpMutexAttributes.
  • Нить может получить дубликат существующего мьютекса с помощью функции DuplicateHandle.
  • Нить может указать имя существующего мьютекса при вызове функций OpenMutex или CreateMutex.

Для того чтобы объявить взаимоисключение принадлежащим текущей нити, надо вызвать одну из ожидающих функций. Нить, которой принадлежит объект, может его "захватывать" повторно сколько угодно раз (это не приведет к самоблокировке), но столько же раз она должна будет его освобождать с помощью функции ReleaseMutex.

Для синхронизации нитей одного процесса более эффективно использование критических секций.

 

 

Пример. Синхронизация нитей с помощью мьютексов.

#include <windows.h>

#include <stdio.h>

HANDLE hMutex;

int a[5];

HANDLE hThr;

unsigned long uThrID;

void Thread( void* pParams )

{

int i, num = 0;

while (1)

{

WaitForSingleObject( hMutex, INFINITE );

for (i=0; i<5; i++) a[i] = num;

num++;

ReleaseMutex( hMutex );

}

}

int main( void )

{

hMutex=CreateMutex( NULL, FALSE, NULL );

hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);

while(1)

{

WaitForSingleObject( hMutex, INFINITE );

printf("%d %d %d %d %dn", a[0], a[1], a[2], a[3], a[4]);

ReleaseMutex( hMutex );

}

return 0;

}

События

Объекты-события используются для уведомления ожидающих нитей о наступлении какого-либо события. Различают два вида событий - с ручным и автоматическим сбросом. Ручной сброс осуществляется функцией ResetEvent. События с ручным сбросом используются для уведомления сразу нескольких нитей. При использовании события с автосбросом уведомление получит и продолжит свое выполнение только одна ожидающая нить, остальные будут ожидать дальше.

Функция CreateEvent создает объект-событие, SetEvent - устанавливает событие в сигнальное состояние, ResetEvent - сбрасывает событие. Функция PulseEvent устанавливает событие, а после возобновления ожидающих это событие нитей (всех при ручном сбросе и только одной при автоматическом), сбрасывает его. Если ожидающих нитей нет, PulseEvent просто сбрасывает событие.

Пример. Синхронизация нитей с помощью событий.

 

#include <windows.h>

#include <stdio.h>

HANDLE hEvent1, hEvent2;

int a[5];

HANDLE hThr;

unsigned long uThrID;

void Thread( void* pParams )

{

int i, num = 0;

while (1)

{

WaitForSingleObject( hEvent2, INFINITE );

for (i=0; i<5; i++) a[i] = num;

num++;

SetEvent( hEvent1 );

}

}

int main( void )

{

hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );

hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );

hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);

while(1)

{

WaitForSingleObject( hEvent1, INFINITE );

printf("%d %d %d %d %dn", a[0], a[1], a[2], a[3], a[4]);

SetEvent( hEvent2 );

}

return 0;

}

 

Семафоры

Объект-семафор - это фактически объект-взаимоисключение со счетчиком. Данный объект позволяет "захватить" себя определенному количеству нитей. После этого "захват" будет невозможен, пока одна из ранее "захвативших" семафор нитей не освободит его. Семафоры применяются для ограничения количества нитей, одновременно работающих с ресурсом. Объекту при инициализации передается максимальное число нитей, после каждого "захвата" счетчик семафора уменьшается. Сигнальному состоянию соответствует значение счетчика больше нуля. Когда счетчик равен нулю, семафор считается не установленным (сброшенным).

Функция CreateSemaphore создает объект-семафор с указанием и максимально возможного начального его значения, OpenSemaphore – возвращает дескриптор существующего семафора, захват семафора производится с помощью ожидающих функций, при этом значение семафора уменьшается на единицу, ReleaseSemaphore - освобождение семафора с увеличением значения семафора на указанное в параметре число.

Пример. Синхронизация нитей с помощью семафоров.

 

#include <windows.h>

#include <stdio.h>

HANDLE hSem;

int a[5];

HANDLE hThr;

unsigned long uThrID;

void Thread( void* pParams )

{

int i, num = 0;

while (1)

{

WaitForSingleObject( hSem, INFINITE );

for (i=0; i<5; i++) a[i] = num;

num++;

ReleaseSemaphore( hSem, 1, NULL );

}

}

int main( void )

{

hSem=CreateSemaphore( NULL, 1, 1, "MySemaphore1" );

hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);

while(1)

{

WaitForSingleObject( hSem, INFINITE );

printf("%d %d %d %d %dn", a[0], a[1], a[2], a[3], a[4]);

ReleaseSemaphore( hSem, 1, NULL );

}

return 0;

}

 

– Конец работы –

Эта тема принадлежит разделу:

Синхронизация нитей внутри процесса в ОС Windows

Синхронизация нитей внутри процесса в ОС Windows... Цель работы изучить возможности применения механизмов синхронизации нитей одного процесса в операционной системе...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Взаимоисключения

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Теоретические сведения
  1. Процессы, нити и волокна в ОС Windows. Дополнительные данные. Процессом (process) называется экземпляр программы, загруженной в память. Этот экземпляр может созда

Защищенный доступ к переменным
Существует ряд функций, позволяющих работать с глобальными переменными из всех нитей, не заботясь о синхронизации, т.к. эти функции сами за ней следят – их выполнение атомарно. Это функции

Порядок выполнения работы
  1. Ознакомиться с постановкой задачи и исходными данными. В соответствии с номером по журналу определить вариант задачи. 2. Согласно рекомендациям, приведенным в исходных д

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги