C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 333 - Критическая секция в MFC / MFC шаг за шагом / Visual C++

Шаг 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() и тут же второй поток. Данные заблокированы и пока первый поток не выполнит все действия второй поток будет заблокирован.


| |
Автор Каев Артем.
[AD]