|
Лабораторная работа №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;
}
Внешнийвид приложения
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.