更新:这不是“ Instruction reordering with lock”问题的重复项。该问题涉及系统提供的同步原语std::mutex
,该原语直到C ++ 11才存在。我还是坚持了C ++ 03。同样,std::mutex
不是基于范围的;它取决于对其lock()
和unlock()
方法的调用;我的问题涉及基于范围的对象实例化问题,而不是像“ Instruction reordering with lock”问题那样对函数调用进行重新排序。
我的原始问题:
我的嵌入式软件开发小组(不使用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
语句的作用域退出时,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]
}