回调设置类成员,我有下面的类,允许通过昂贵的计算设置一个值,我们可以假装计算异步发生在其他线程。该类还有一个方法,如果需要得到的电流值,也许这样做计算同步:与线程安全的方式
class Example {
public:
Example() : x_(0) {}
void Set(int x) {
SomeOtherFunc(x, callback_, false);
}
void Finished(int y) {
x_ = y;
}
const int Get() {
if (!x_) {
SomeOtherFunc(1, callback_, true);
}
return x_;
}
private:
int x_;
std::function<void(int)> callback_ =
std::bind(&Example::Finished, this, std::placeholders::_1);
};
而且让我们假装这个功能:
void SomeOtherFunc(int x, const std::function<void(int)>& func,
bool blocking) {
// Do something expensive, in another thread, possibly blocking.
func(x * 2);
}
这样的工作方式,我想:
Example e1, e2;
e1.Set(5);
// "10 2"
std::cout << e1.Get() << " " << e2.Get();
我关注的是如下情况:
Example e;
e.Set(10); // Takes a while
e.Get(); // Need the value now
个
我的问题:
- 是在
Example
类线程安全的?如果不是的话,怎么会这样呢?看起来像锁会起作用,但可能是矫枉过正。 - 由于
SomeOtherFunc
的工作很贵,我只想调用一次这个函数。在类内部设置一个标志,每当调用被创建时被设置为true,并且在调用之前被检查,这似乎是合理的(但它是否是线程安全的?)。问题是,如果我叫Set
,然后Get
随即,我想Get
为x_
返回“最终”值。我如何确保?也就是说,如果设置了该标志,我该如何让Get
等待回调以线程安全的方式完成?
因此,如果一个调用正在进行,call_once会在'Get()中阻塞?这几乎就是我想要的。 –
@SteveD是的,这是'call_once'保证的。对于'Get()'(和'Set()')的所有(并发)调用将会阻止,如果当SomeOtherFunc()无论是由'Get()'还是'Set()'启动' – LWimsey
再次感谢,这正是我所需要的 –