繁体   English   中英

易失性成员函数的性能结果

[英]Performance consequence of volatile member functions

我在2001年发现了一篇关于Dobbs博士的文章: volatile - 多线程程序员最好的朋友 我总是发现'volatile'有点无用 - 至少作为变量的限定符 - 因为对线程之间共享的变量的访问总是会经历某种类型的库层。

尽管如此,将类实例和方法标记为“易变”以表明文章中提供的线程安全程度似乎非常引人注目。

为了快速总结一下这篇文章,核心思想是可以声明一个这样的类:

struct SomeObject {
  void SingleThreadedMethod();
  void Method();
  void Method() volatile;
};

然后,类的实例,如下所示:

// An object that will only be accessed from a single thread.
SomeObject singleThreaded;
// An objecect that will be accessed from multiple threads.
volatile SomeObject sharedObject;

sharedObject.SingleThreadedMethod(); //this will be an compile error
sharedObject.Method(); // will call the volatile overload of Method
singleThreaded.Method(); // would call the non volatile overload of Method.

想法是实现像“Method()volatile”这样的方法:

void SomeObject::Method() volatile {
  enter_critical_section();
  const_cast<Method*>(this)->Method();
  leave_critical_Section();
}

显然,智能指针可以自动化原子锁定和转换为非易失性进程 - 关键是可以在其预期用途中使用volatile限定符来标记类成员和实例以指示它们如何运行从多个线程使用,因此让编译器告诉开发人员何时在volatile对象上调用单线程(非易失性)方法,或者甚至自动选择线程安全版本。

关于这种方法的问题是:“易变”合格方法的性能影响是什么? 是否强制编译器假定在volatile函数中访问的所有变量都需要被视为volatile,从而被排除在优化机会之外? 局部变量会被排除在优化之外吗? 如果是这样,那么对于任何不稳定的合格成员函

  • 不,局部变量在volatile方法中不会被假定为volatile,几乎与const方法中的局部变量不假设为const的方式相同。
  • 在volatile方法中,类的所有成员都将被视为volatile,这与const方法中处理const的所有非可变成员几乎相同。 对于挥发性物质没有相当的可变性。
  • this不是一个易失性指针,因此访问它不会每次都从内存中加载它。 然而, this将是指向volatile的指针,这意味着*this被视为volatile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM