在中等范围(例如CriticalSection)中创建的对象的生命周期

时间:2019-02-01 22:51:27

标签: c++ c++03

更新:这不是“ Instruction reordering with lock”问题的重复项。该问题涉及系统提供的同步原语std::mutex,该原语直到C ++ 11才存在。我还是坚持了C ++ 03。同样,std::mutex不是基于范围的;它取决于对其lock()unlock()方法的调用;我的问题涉及基于范围的对象实例化问题,而不是像“ Instruction reordering with lock”问题那样对函数调用进行重新排序。


我的原始问题:

我的嵌入式软件开发小组(不使用Visual Studio的 )按照通常的方法,有一小类并发控制类。类型;例如CriticalSectionCriticalSection对象可以在不能同时执行的任何范围内实例化。它的构造函数声明一个互斥量,并且当范围退出时,对象的析构函数会自动释放该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语句的作用域退出时,if()释放了互斥锁,因此在[Point D]处已释放了互斥锁。但是,是否允许编译器(可能出于优化目的)早于[Point B]实例化CriticalSection,只要它在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]
}

0 个答案:

没有答案