Как создать блокировки в VC ++? - PullRequest
2 голосов
/ 20 февраля 2011

Допустим, я реализую критическую секцию и защищаю некоторый массив в VC ++, как мне это сделать, используя блокировки в VC ++?

Ответы [ 3 ]

10 голосов
/ 20 февраля 2011

Вам нужны функции API для критических секций :

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

MSDN предоставит тривиальный пример .

Если вы используете MFC, вы, вероятно, будете использовать CCriticalSection, который объединяет API критической секции Win32 в классе.

Что касается того, как вы делаете это с вашим массивом. Что ж, ваши потоки будут выполнять только блоки кода, защищенные блокировкой, по одному за раз. Вам нужна блокировка, чтобы остановить условия гонки, когда два потока пытаются одновременно прочитать / записать в одну и ту же область памяти, или действительно более тонкие условия, которые могут нарушить ваш алгоритм.

Если бы вы описали массив, его содержимое и то, как вы оперируете над ним, то можно было бы дать вам какой-то конкретный совет. То, как вы будете работать с этим массивом, будет иметь большое значение для идеальной стратегии синхронизации, и в некоторых случаях вы сможете использовать методы без блокировки.

2 голосов
/ 20 февраля 2011

Создайте мьютекс с помощью CreateMutex , вступите во владение им с помощью WaitForSingleObject , отмените владение мьютексом с помощью ReleaseMutex и удалите его, когда вы закончите с CloseHandle .

Альтернативы, которые вы можете найти, включают CriticalSections , Семафоры и События .

0 голосов
/ 20 февраля 2011

Если вы используете VS 2010, объект criticial_section включается в заголовочный файл ppl.h.

Обратите внимание, что существует также шаблон класса concurrent_vector, который синхронизирован (т.е. блокировки не нужны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...