gpt4 book ai didi

c++ - 缓存的不可变值 : avoid lock

转载 作者:行者123 更新时间:2023-11-28 07:51:29 25 4
gpt4 key购买 nike

假设我有以下代码:

struct Obj {
mutable bool valueIsCached_;
mutable int value_;
const int parameter_;

Obj (int parameter) : valueIsCached_ (false), parameter_ (parameter) {
}

int getValue () const {
if (!valueIsCached) {
value_ = calculateValue (); // #1
valueIsCached_ = true; // #2
}
return value_;
}

private:
int calculateValue () {
/* calculate value based on parameter and return it;
return value only depends on value of parameter_
(no side effects; no dependence on global state)
*/
}
};

如果编译器不对标记为#1 和#2 的行重新排序,那么这段代码显然是线程安全的。可能发生的最糟糕的事情是多次计算 value_。然而,一旦我们不能保证#2 发生在#1 之后,代码就会变得线程不安全。

  1. 我们如何避免这种情况?
  2. 如果 value_ 的类型是例如 struct,事情会变得更糟吗?

最佳答案

您需要插入一个屏障。这是 VC++ 的代码:

int getValue () const {
if (!valueIsCached_) {
value_ = calculateValue (); // #1
_WriteBarrier(); // force value_ to be written first.
valueIsCached_ = true; // #2
}
return value_;
}

请注意,这是假设 calculateValue 是线程安全的,因为它可以被多个线程调用,并且写入 value_valueIsCached_ 不止一次是安全的。

关于c++ - 缓存的不可变值 : avoid lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688906/

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