gpt4 book ai didi

c++ - volatile 成员函数的性能后果

转载 作者:IT老高 更新时间:2023-10-28 22:04:57 29 4
gpt4 key购买 nike

我找到了一篇关于 Dobbs 博士的 2001 年文章:volatile - Multithreaded Programmer's Best Friend .我总是发现 '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 函数中访问的所有变量都需要被视为 volatile 并因此被排除在优化机会之外?局部变量会被排除在优化之外吗?如果是这样的话,这可能会对任何 volatile 合格的成员函数造成很大的性能拖累。

最佳答案

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

关于c++ - volatile 成员函数的性能后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428535/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com