2011-02-19 2 views

ответ

10

Вам нужны функции API для critical sections:

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

MSDN предоставляет trivial example.

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

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

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

2

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

Альтернативы, которые вы можете найти, включают CriticalSections, Semaphores и Events.

+0

Чтобы добавить к вашему ответу, мьютексы могут использоваться в разных процессах, в отличие от критических разделов, которые работают только для потоков в рамках одного процесса. С другой стороны, критические секции работают лучше и являются повторными. –

0

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

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

+1

Этот класс 'critical_section' является частью среды выполнения параллелизма, а не прямой Win32 и не является повторным. Это важные моменты. –

Смежные вопросы