Вам нужны функции API для критических секций :
InitializeCriticalSection
Вызовите один раз из любого потока, но обычно из основного потока, чтобы инициализировать блокировку. Инициализируйте, прежде чем делать с ним что-либо еще.
EnterCriticalSection
Вызов из любого потока для получения блокировки. Если другой поток имеет блокировку, он будет блокироваться, пока не сможет получить блокировку. Критические разделы являются входящими, что означает, что поток успешно получает блокировку, даже если он уже удерживает ее.
LeaveCriticalSection
Снять замок. Каждый вызов EnterCriticalSection
должен быть связан с соответствующим вызовом LeaveCriticalSection
. Не позволяйте исключениям останавливать эти вызовы на получение / разблокировку.
DeleteCriticalSection
Вызовите один раз из любого потока, но обычно из основного потока, чтобы завершить блокировку. Делайте это, когда никакие нити не удерживают блокировку. После того, как вы позвоните, блокировка станет недействительной, и вы не сможете попытаться снова ее получить.
MSDN предоставит тривиальный пример .
Если вы используете MFC, вы, вероятно, будете использовать CCriticalSection
, который объединяет API критической секции Win32 в классе.
Что касается того, как вы делаете это с вашим массивом. Что ж, ваши потоки будут выполнять только блоки кода, защищенные блокировкой, по одному за раз. Вам нужна блокировка, чтобы остановить условия гонки, когда два потока пытаются одновременно прочитать / записать в одну и ту же область памяти, или действительно более тонкие условия, которые могут нарушить ваш алгоритм.
Если бы вы описали массив, его содержимое и то, как вы оперируете над ним, то можно было бы дать вам какой-то конкретный совет. То, как вы будете работать с этим массивом, будет иметь большое значение для идеальной стратегии синхронизации, и в некоторых случаях вы сможете использовать методы без блокировки.