Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 易失性成员函数的性能后果_C++_Multithreading_Volatile - Fatal编程技术网

C++ 易失性成员函数的性能后果

C++ 易失性成员函数的性能后果,c++,multithreading,volatile,C++,Multithreading,Volatile,我发现了一篇2001年关于Dobbs博士的文章:。我总是发现“volatile”有点没用——至少作为变量的限定词——因为访问线程之间共享的变量总是要经过某种库层 尽管如此,如本文所述,将类实例和方法标记为“volatile”以指示其线程安全程度似乎非常有说服力 为了快速总结本文,核心思想是可以声明如下类: struct SomeObject { void SingleThreadedMethod(); void Method(); void Method() volatile; };

我发现了一篇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.
然后是类的实例,如下所示:

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();
}
void SomeObject::Method()volatile{
输入_critical_section();
const_cast(this)->Method();
保留“关键”部分();
}
显然,智能指针可以自动执行原子锁并将其转换为非易失性进程——关键是在其预期用途中,可以使用易失性限定符来标记类成员和实例,以指示如何从多个线程使用它们,从而使编译器在单线程运行时告知开发人员正在对易失性对象调用(非易失性)方法,甚至自动选择线程安全版本


关于这种方法,我的问题是:“volatile”限定方法的性能影响是什么?编译器是否被迫假设volatile函数中访问的所有变量都需要被视为volatile,从而被排除在优化机会之外?局部变量是否会被排除在优化之外?这可能是一个很大的问题在任何易失性限定成员函数上拖动performance(如果有)。

  • 不,局部变量在volatile方法中不会被假定为volatile,这与局部变量在const方法中不被假定为const的方式几乎相同
  • 在volatile方法中,类的所有成员都将被视为volatile,这与在const方法中处理所有非可变成员的方式几乎相同。volatile没有等价的mutable
  • 不会是易失性指针,因此访问它不会每次都从内存加载它。但是
    将是指向易失性的指针,这意味着
    *此
    被视为易失性指针

“编译器是否被迫假定在volatile函数中访问的所有变量都需要被视为volatile,从而排除在优化机会之外?”我认为是这样的:每次触摸对象时,编译器都需要从内存加载
这个
指针。但是,局部变量不应该受到影响。一些相关帖子:,我不“喜欢”很多问题,但我喜欢这个问题。问得好。这似乎是对规则最一致的解释。