Използване на статичен булев срещу критичен раздел за едновременност

Така че проектирам нов софтуерен интерфейс за USB HID устройство и имам въпрос относно защитата на паралелността. Предполагам, че ще трябва да добавя защита на паралелността около моите извиквания към ReadFile и WriteFile (моля, поправете ме, ако греша), тъй като те може да бъдат извикани от различни нишки в моя дизайн.

В миналото понякога съм използвал статични булеви стойности, за да внедря безопасността на нишката, добавяйки цикъл с 1ms изчакване върху него, докато bool покаже, че кодът е безопасен за въвеждане. Използвал съм също CriticalSections. Може ли някой да ми каже дали CriticalSections са фундаментално по-добри от използването на статичен bool. Знам, че няма да се налага да кодирам цикъл на изчакване, но каква честота на запитване използват във VC++, за да проверят състоянието на заключването? Свързани ли са с операционната система по някакъв начин, който ги прави по-добри? Използването на bool за проверка на едновременност не винаги ли е безопасно? и т.н.


person Ian    schedule 23.04.2014    source източник
comment
C++11 добави поддръжка на нишки към стандартната библиотека, трябва да разгледате използването на нещо като std::mutex   -  person Rastaban    schedule 24.04.2014
comment
Не, mutex е твърде скъп. CriticalSections трябва да го направи. Ще ги потърся в std lib.   -  person Ian    schedule 24.04.2014
comment
Виждам, че std::mutex не е непременно windows mutex, но може да се реализира като 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