ОБНОВЛЕНИЕ: Это НЕ дубликат вопроса " Изменение порядка команд с блокировкой ".Этот вопрос касается системного примитива синхронизации std::mutex
, который не существовал до C ++ 11.Я все еще застрял с C ++ 03.Кроме того, std::mutex
не основано на области;зависит от вызовов его методов lock()
и unlock()
;мой вопрос касается вопросов создания экземпляров объектов на основе области, а не переупорядочения вызовов функций, таких как вопрос " переупорядочение инструкций с блокировкой ".
Мой оригинальный вопрос:
Моя группа по разработке встроенного программного обеспечения (, которая не использует Visual Studio! ), имеет небольшое семейство классов управления параллелизмом, следующих заобычные виды;например, CriticalSection
.Объект CriticalSection
может быть создан в любой области, которая не должна выполняться одновременно.Его конструктор запрашивает мьютекс, и при выходе из области действия деструктор объекта автоматически освобождает мьютекс, используемый этим CriticalSection
, что важно в случае аномального выхода из области действия;я не понимаю ничего страшного.
Мой вопрос: Может ли компилятор создать экземпляр объекта где-либо в области видимости, или он связан спецификацией с целью создания экземпляра в точке управленияпоток где это определяется?Это важно: чтобы обеспечить максимальный параллелизм, критический раздел должен жить как можно дольше.
Пример:
void MyClass::aMethod()
{
// ...some code that can execute concurrently...
// [Point A]
if (something)
{
// ...some code that can execute concurrently and should
// not be protected by the CriticalSection...
// [Point B]
CriticalSection myCS;
// [Point C]
// ...code that must NOT execute concurrently...
}
// [Point D]
// ...more code that can execute concurrently...
}
CriticalSection
освобождает мьютекс как область действия *Оператор 1037 * завершается, поэтому в [Точка D] мьютекс был освобожден.Но разрешено ли компилятору, возможно, в целях оптимизации, создавать экземпляр CriticalSection
раньше, чем [Точка B], если он входит в сферу действия оператора if()
?Если это так, то я предполагаю, что для ограничения его объема мне нужно было бы добавить ненужную в противном случае область, чтобы предотвратить это, я прав?Например ....
void MyClass::aMethod()
{
// [Point A]
if (something)
{
// [Point B]
{ // scope for critical section
CriticalSection myCS;
// [Point C]
} // end scope for critical section
}
// [Point D]
}