Допустим, я реализую критический раздел и защищаю некоторый массив в VC++, как это сделать, используя блокировки в VC++?Как создать блокировки в VC++?
ответ
Вам нужны функции API для critical sections:
InitializeCriticalSection
вызова один раз, из любого потока, но, как правило, основной поток, чтобы инициализировать блокировку. Инициализируйте, прежде чем делать что-нибудь еще с этим.EnterCriticalSection
Позвоните из любой темы, чтобы приобрести замок. Если другой поток имеет блокировку, он будет блокироваться, пока не сможет получить блокировку. Критические разделы являются повторными, что означает, что поток успешно получает блокировку, даже если она уже удерживает ее.LeaveCriticalSection
Освободить замок. Каждый вызовEnterCriticalSection
должен быть сопряжен с соответствующим вызовом наLeaveCriticalSection
. Не позволяйте исключениям останавливать повторные вызовы получения/освобождения.DeleteCriticalSection
Вызовите один раз из любого потока, но обычно основного потока, чтобы завершить блокировку. Делайте это, когда нити не удерживают замок. После того, как вы назовете это, блокировка недействительна, и вы не сможете ее снова приобрести.
MSDN предоставляет trivial example.
Если вы используете MFC, то вы, вероятно, используете CCriticalSection
, который завершает работу API-интерфейсов критического раздела Win32 в классе.
Как вы это сделаете с помощью своего массива. Ну, ваши потоки будут выполнять только блоки кода, защищенные блокировкой по одному за раз. Вам необходимо заблокировать, чтобы остановить условия гонки, когда две нити пытаются одновременно считывать/записывать в одно и то же место памяти или даже другие более тонкие условия, которые могут нарушить ваш алгоритм.
Если вам нужно описать массив, его содержимое и то, как вы работаете на нем, тогда вам будет возможно дать вам конкретный совет. Именно то, как вы работаете с этим массивом, будет иметь большое значение для идеальной стратегии синхронизации, и в некоторых случаях вы можете использовать методы блокировки.
Создание мьютекса с помощью CreateMutex, взять на себя ответственность его через WaitForSingleObject, освободить право собственности на мьютекс с помощью ReleaseMutex, и удалил его, когда вы закончите с CloseHandle.
Альтернативы, которые вы можете найти, включают CriticalSections, Semaphores и Events.
Если вы используете VS 2010, объект criticial_section
включен в файл заголовка ppl.h.
Примечание. Существует также шаблон шаблона класса concurrent_vector
, который синхронизирован (то есть блокировки не нужны).
Этот класс 'critical_section' является частью среды выполнения параллелизма, а не прямой Win32 и не является повторным. Это важные моменты. –
- 1. Как создать функцию блокировки
- 2. Как создать и сохранить файл в vC++
- 3. Как создать переменную размерную матрицу в VC++
- 4. Как создать массив объектов в VC++ 2010?
- 5. Как создать файл без блокировки в C#
- 6. Невозможно создать тип блокировки
- 7. Создать управляемый класс VC++ со списком другого управляемого класса VC++
- 8. Создать новую точку подключения в VC++ 6?
- 9. Как создать водяной знак в поле редактирования в MFC VC++
- 10. Как создать диалог без блокировки основной формы?
- 11. создать индекс без блокировки DB
- 12. Как создать блокировки/разблокирован флажок для WPF
- 13. Как создать нон блокировки всплывающих окон
- 14. Создать файл без открытия/блокировки?
- 15. Как создать файл в VC++ 6.0, когда включен UAC?
- 16. Как создать Raw пакеты и отправить по сети в VC++
- 17. Как создать поле пароля и кнопку в vC++
- 18. Как создать шаблоны заголовков VC++ и исходные файлы в VS2010
- 19. Как создать диспетчер файловой системы/каталога в VC++?
- 20. Как создать массив переменной длины/вектор String^в VC++
- 21. Как создать изображения BitMap с использованием разных цветов в VC++?
- 22. Как создать кнопку roundrect с помощью win32 API в vC++
- 23. Как создать единую общую модель для всех VC в UITabBarController?
- 24. Создать простую программу, используя VC++ с MFC?
- 25. Как читать данные, установленные в первом VC в других VC?
- 26. Создать C# Winforms с VC++ OpenGL Scene
- 27. Мой код VC++ не удается создать каталог
- 28. VC++: Помогите создать простой класс COM
- 29. не удалось создать проект VC++, с VS11
- 30. MS VC++ как построить DLL, не требуя vc redist
Чтобы добавить к вашему ответу, мьютексы могут использоваться в разных процессах, в отличие от критических разделов, которые работают только для потоков в рамках одного процесса. С другой стороны, критические секции работают лучше и являются повторными. –