- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这段代码是线程安全的吗?我应该在函数 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;}
};
最佳答案
是的,它是线程安全的,尽管您可以将 Lock
重命名为 TryLock
,因为在它成功之前您不会在循环中调用 CAS。传统上,Lock
操作应该阻塞,直到获取成功。
关于 volatile
,the docs std::atomic
的指定(关于 =
运算符):
Atomically assigns a value t to the atomic variable. Equivalent to store(desired).
然后关于store
:
void store( T desired, memory_order = std::memory_order_seq_cst );
然后关于memory_order = std::memory_order_seq_cst
:
所以不,这里不需要 volatile
。此外,volatile
的保证比上面的要弱(事实上,volatile
在 C++ 中几乎没用):
Within a thread of execution, accesses (reads and writes) to all volatile objects are guaranteed to not be reordered relative to each other, but this order is not guaranteed to be observed by another thread, since volatile access does not establish inter-thread synchronization.
关于c++ - 这个简单的(原子的)锁线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340208/
我是一名优秀的程序员,十分优秀!