Время жизни объекта, созданного в средней области (например, CriticalSection) - PullRequest
0 голосов
/ 02 февраля 2019

ОБНОВЛЕНИЕ: Это НЕ дубликат вопроса " Изменение порядка команд с блокировкой ".Этот вопрос касается системного примитива синхронизации 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]
}
...