Использование критических секций

Страницы работы

Содержание работы

Лабораторная работа №3

Тема: Использование критических секций

 
 



Лабораторная работа №3

Использование критических секций.

Цель: Ознакомиться с понятием «критические секции».

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

Теоретические сведения:

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

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

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

Функция Unlock() освобождает объект критической секции. В результате другой поток сможет его захватить и получить доступ к защищенным данным.

Использование функций Lock() иUnlock():

void CritSection(LPVOID param,int indicator)

{

critical.Lock();

char str[40];

_itoa(indicator,str,10);

strcat(str," поток - Критическая секция");

::MessageBox((HWND)param, str, "Read Thread", MB_OK);

for (int i=0; i<10; ++i)

{

for(int g=0;g<10000;++g)

{    }

}

critical.Unlock();

}

Использование класса ССriticalSection:

UINT ReadThreadProc1(LPVOID param)

{   

for (int i=0; i<5; i++)

{m_Bar1.StepIt();Sleep(1000);}

indicator_1=1;

CritSection(param, indicator_1);

for ( i=5; i<9; i++)

{m_Bar1.StepIt();Sleep(1000);}

return 0;

}

Внешнийвид приложения

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
65 Kb
Скачали:
0