Использование статического логического значения против критической секции для параллелизма

Итак, я разрабатываю новый программный интерфейс для устройства USB HID, и у меня есть вопрос о защите от параллелизма. Я предполагаю, что мне придется добавить защиту от параллелизма вокруг моих вызовов ReadFile и WriteFile (пожалуйста, поправьте меня, если я ошибаюсь), поскольку они могут вызываться из разных потоков в моем дизайне.

В прошлом я иногда использовал статические логические значения для обеспечения безопасности потоков, добавляя цикл с ожиданием в 1 мс, пока логическое значение не укажет, что код можно безопасно вводить. Я также использовал CriticalSections. Может ли кто-нибудь сказать мне, что CriticalSections принципиально лучше, чем использование static bool. Я знаю, что мне не придется кодировать цикл ожидания, но какую частоту опроса они используют в VC++ для проверки состояния блокировки? Подключены ли они к ОС каким-то образом, что делает их лучше? Является ли использование bool для проверки параллелизма не всегда безопасным? и Т. Д.


person Ian    schedule 23.04.2014    source источник
comment
С++ 11 добавил поддержку потоков в стандартную библиотеку, вы должны посмотреть на использование чего-то вроде std::mutex   -  person Rastaban    schedule 24.04.2014
comment
Нет, мьютекс слишком дорог. CriticalSections должны сделать это. Я поищу их в стандартной библиотеке.   -  person Ian    schedule 24.04.2014
comment
Я вижу, что std::mutex не обязательно является мьютексом Windows, но может быть реализован как CS.   -  person Ian    schedule 24.04.2014


Ответы (2)


Я мало знаю о C++, но параллелизм обычно не реализуется посредством опроса и, как правило, не должен — опрос тратит впустую процессорное время и энергию. Два основных низкоуровневых подхода:

  1. Блокировка по замку, возможно с таймаутом.

  2. Использование примитива без блокировки, скорее всего, либо сравнения и установки, либо сравнения и замены.

Оба эти подхода поддерживаются типичным современным оборудованием. Они приводят к очень разным «ароматам» взаимодействия. Написание структур данных без блокировок лучше оставить экспертам (они, как правило, сложны, и, что более важно, бывает трудно понять, правильны ли они и гарантируют ли они прогресс в условиях разногласий — их описания обычно сопровождаются страницами доказательств). К счастью, вы можете получить их библиотеки, и они работают быстрее и лучше, чем блокирующие, во многих, но не во всех случаях.

person dfeuer    schedule 23.04.2014
comment
Не уверен, что такое структуры или примитивы без блокировки, но я не защищаю структуры данных, а только ввод/вывод USB. - person Ian; 24.04.2014

Ладно, не суть. Я просто буду придерживаться критических разделов. Я надеялся получить интересную информацию о том, как работают критические секции, или хотя бы ссылку на статью об этом. IE - почему они отличаются от простого написания собственного цикла опроса. Из этого обсуждения я вижу: производительность std::mutex по сравнению с win32 CRITICAL_SECTION что есть некоторая путаница в том, как работает std::mutex, но я думаю, что лучше использовать CRITICAL_SECTIONS, так как это кажется самым надежным способом получить самую быструю защиту от параллелизма в Windows.

В любом случае спасибо.

person Ian    schedule 24.04.2014