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