这些锁定的内存访问是等价的吗?
Are these locked memory accesses equivalent?
void f1(volatile int* ptr, int value)
{
*ptr = value;
lock or DWORD PTR [rsp], 0; // MemoryBarrier()
}
void f2(volatile int* ptr, int value)
{
xchg DWORD PTR [ptr], value; // InterlockedExchange(ptr, value);
}
在语义上等价。显然,无论是否指定lock
前缀,xchg
都将被锁定。
编辑:我目前使用VS2010,但可能会移植到VS2012,我相信关于volatile
的编译器语义已经再次改变。
大致是的。在第一种情况下,lock or
确保在任何其他CPU可以读取更多内存之前数据已经更新,在第二种情况下,xchg
指令有一个隐式锁,因此所有其他处理器(核心)将不得不"释放"它们的*ptr值,然后处理器才能更新该值。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 如何使用互斥锁锁定对布尔值的访问?
- 使用锁定XCMPCHG16B _ InterlockedCompareexchange128读取访问违规
- 锁定文件,避免使用相同的过程以访问两次
- 如何使用std::lock_guard锁定对std::map的读写访问
- 我创建锁定文件的功能导致访问冲突
- SQLite C++多个进程以只读模式访问数据库时"数据库已锁定"
- 如何为多线程访问实现类锁定对象
- 为什么在锁定weak_ptr时出现访问冲突?
- Sqlite数据库仍然锁定/不可访问
- 锁定互斥锁vs访问磁盘
- 让我在队列前端访问时锁定互斥对象
- 这些锁定的内存访问是等价的吗?
- 在Linux上锁定对单个进程内数据访问的最快方法