1
由于std::lock_guard
不std::atomic_flag
工作,我已经实现了我自己的版本:的std :: atomic_flag和std :: lock_guard
class atomic_guard {
public:
inline atomic_guard(std::atomic_flag& lock) : lock(lock) {
while (this->lock.test_and_set()) {
/* spin */
};
};
inline ~atomic_guard() {
this->lock.clear();
};
private:
std::atomic_flag& lock;
};
这似乎很好地工作。问题是:这是实施RAI的正确方法吗?还有一个内置的后卫吗?如果不是,为什么?专业std::lock_guard<std::atomic_flag>
看起来很自然。
“低效率”是什么意思?标准互斥是不是更有效率的atomic_flag?至少在某些情况下,例如当锁定时间应该是短暂的。 – freakish
@freakish如果一个线程正在等待使用'my_mutex'来获取锁,那么它正在浪费很多CPU时间,因为它在繁忙的while循环中 – LWimsey
我不会称之为“浪费”。你获得执行时间,所以它是一个交易。看起来atomic_flag甚至可以比标准互斥量快50倍。所以如果你锁定很短的时间,那么“浪费”这些CPU周期可能是值得的。这里是基准测试:https://www.arangodb.com/2015/02/comparing-atomic-mutex-rwlocks/当然,我会在我的场景中进行适当的测试,但我预计至少会有2x加速。 – freakish