这段代码是否安全?我应该在函数sig中有volatile吗? (例如:void Unlock() volatile {v=0;}
)如果不是我如何使这个线程安全?
class SimpleLock {
std::atomic<int> v;
public:
bool try_lock() { int z=0; return v.compare_exchange_strong(z, 1); }
void lock() { while(try_lock()==false) std::this_thread::yield(); }
void unlock() {v=0;}
};
答案 0 :(得分:8)
是的,虽然您可以将Lock
重命名为TryLock
,但它是线程安全的,因为您不会在循环中调用CAS,直到成功为止。传统上Lock
操作应该阻塞,直到获取成功。
关于volatile
,std::atomic
the docs指定(关于=
运营商):
以原子方式为原子变量赋值t。相当于商店(所需)。
然后关于store
:
void store(T desired,memory_order = std :: memory_order_seq_cst);
然后关于memory_order = std::memory_order_seq_cst
:
所以不,你这里不需要volatile
。另外,volatile
的保证比上面的保证弱(事实上,volatile
在C ++中几乎没用):
在执行的线程中,访问(读取和写入)所有 保证不会相对于每个对象重新排序volatile对象 另外,但这个顺序不能保证被另一个人观察到 线程,因为volatile访问不建立线程间 同步。