Шаг 333 - Критическая секция в MFC

Для подробного ознакомления лучше прочитать предыдущий "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 80 - Что такое критическая секция (Critical Section)", API: "Шаг 116 - EnterCriticalSection, LeaveCriticalSection и InitializeCriticalSection".

В MFC для работы с критическими секциями есть специальный класс CCriticalSection. Что нужно, чтобы им воспользоваться ? Создать объект класса.

CCriticalSection criticalsection;

Начинать обработку данных с вызова метода Lock():

criticalsection.Lock();

А завершив обработку вызвать Unlock():

criticalsection.Unlock();

Развивая идею примера приведенного в Шаге 116 API лучше всего создавать класс массива, в котором при работе с данными будет реализован механизм защиты. Примерно вот так:

class CCountArray
{
private:
	int array[10];
	CCriticalSection criticalsection;
public:
	CCountArray();
	~CCountArray();
	void SetArray(int value);
};

Обратите внимание на то, что вместе с созданием объекта класса будет создан и объект синхронизации CCriticalSection criticalsection;. Будет произведена инициализация. А потом ? А потом при доступе к данным нужно производить блокировку.

void CCountArray::SetArray(int value)
{
	criticalsection.Lock();
	for (int x=0;x<10;++x) array[x]=value;
	criticalsection.Unlock();
}

Организовав таким образом доступ к данным мы больше можем не заботиться о синхронизации. Любой поток может вызывать методы и синхронизация будет работать. Например, поток вызовет SetArray() и тут же второй поток. Данные заблокированы и пока первый поток не выполнит все действия второй поток будет заблокирован.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 1.05.2001