Категория
Информатика
Тип
реферат
Страницы
6 стр.
Дата
17.02.2010
Формат файла
.rtf — Rich Text Format (Wordpad)
Архив
20757.zip — 22.98 kb
  • kriticheskie-sekcii_20757_1.rtf — 178.77 Kb
  • Readme_docus.me.txt — 125 Bytes
Рейтинг
10  из 10
Оценок
1
Оцените работу
Хорошо  или  Плохо


Текст работы

Критические секции Alena
Alena
Критические секции
Павел Блудов
Введение
Критические секции -- это объекты, используемые для блокировки доступа всех нитей (threads) приложения, кроме одной, к некоторым важным данным в один момент времени. Например, имеется переменная m_pObject и несколько нитей, вызывающих методы объекта, на который ссылается m_pObject, причем эта переменная может изменять свое значение время от времени. Иногда там даже оказывается нуль. Предположим, имеется вот такой код:
// Нить №1
void Proc1()
if (m_pObject)
m_pObject->SomeMethod();
// Нить №2
void Proc2(IObject *pNewObject)
if (m_pObject)
delete m_pObject;
m_pObject = pNewobject;
Тут мы имеем потенциальную опасность вызова m_pObject->SomeMethod() после того, как объект был уничтожен при помощи delete m_pObject. Дело в том, что в системах с вытесняющей многозадачностью выполнение любой нити процесса может прерваться в самый неподходящий для нее момент времени, и начнет выполняться совершенно другая нить. В данном примере неподходящим моментом будет тот, в котором нить №1 уже проверила m_pObject, но еще не успела вызвать SomeMethod(). Выполнение нити №1 прервалось, и начала исполняться нить №2. Причем нить №2 успела вызвать деструктор объекта. Что же произойдет, когда нить №1 получит немного процессорного времени и вызовет-таки SomeMethod() у уже несуществующего объекта? Наверняка что-то ужасное.
Именно тут приходят на помощь критические секции. Перепишем наш пример.
// Нить
№1
void Proc1()
::EnterCriticalSection(&m_lockObject);
if (m_pObject)
m_pObject->SomeMethod();
::LeaveCriticalSection(&m_lockObject);
// Нить №2
void Proc2(IObject *pNewObject)



Ваше мнение



CAPTCHA