1. 基本实现
// objc-os.h 中的内存屏障实现
#define OSMemoryBarrier() __sync_synchronize()
// ARM 架构特殊处理
static ALWAYS_INLINE void
OSMemoryBarrierBeforeUnlock() {
#if defined(__arm__) || defined(__arm64__)
OSMemoryBarrier();
#endif
}
2. 解锁前的内存屏障
// 自旋锁解锁时使用内存屏障
static ALWAYS_INLINE void
OSSpinLockUnlock(volatile OSSpinLock *lock) {
// 确保之前的内存操作都完成
OSMemoryBarrierBeforeUnlock();
// 解锁操作
OSAtomicAnd32Barrier(0, &lock->value);
}
3. 原子操作中的内存屏障
// 带内存屏障的原子操作
static ALWAYS_INLINE int32_t
OSAtomicIncrement32Barrier(volatile int32_t *value) {
// 使用带内存屏障的原子加操作
return __sync_fetch_and_add(value, 1) + 1;
}
static ALWAYS_INLINE int32_t
OSAtomicDecrement32Barrier(volatile int32_t *value) {
// 使用带内存屏障的原子减操作
return __sync_fetch_and_sub(value, 1) - 1;
}
4. 不同架构的处理
// 针对不同架构的内存屏障实现
#if __has_feature(c_atomic)
// 使用 C11 原子操作
#define OSAtomicIncrement32Barrier(p) \
__c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_SEQ_CST)
#else
// 使用平台特定的实现
static ALWAYS_INLINE int32_t
OSAtomicIncrement32Barrier(volatile int32_t *value) {
return __sync_fetch_and_add(value, 1) + 1;
}
#endif
5. 使用场景
5.1 引用计数操作
bool objc_object::rootTryRetain() {
// 使用带内存屏障的原子操作
if (OSAtomicCompareAndSwapInt32Barrier(0, 1, &refcount)) {
return true;
}
return false;
}
5.2 属性原子访问
// 原子属性的 setter
static inline void reallySetProperty(id self, SEL _cmd, id newValue,
ptrdiff_t offset, bool atomic)
{
if (atomic) {
spinlock_t& slotlock = PropertyLocks[GOODHASH(offset)];
slotlock.lock();
// 写入值
*((id *)((char *)self + offset)) = newValue;
// 确保内存操作完成
OSMemoryBarrier();
slotlock.unlock();
}
}
6. 内存序保证
// 1. Acquire 语义
#define ACQUIRE_BARRIER() \
__asm__ __volatile__("dmb ish" : : : "memory")
// 2. Release 语义
#define RELEASE_BARRIER() \
__asm__ __volatile__("dmb ish" : : : "memory")
// 3. 完全内存屏障
#define FULL_BARRIER() \
__asm__ __volatile__("dmb ish" : : : "memory")
7. 性能考虑
// 1. 避免不必要的内存屏障
void performOperation() {
if (!needsBarrier) {
// 使用非屏障版本的操作
OSAtomicIncrement32(value);
} else {
// 使用带屏障版本
OSAtomicIncrement32Barrier(value);
}
}
// 2. 合并内存屏障
void batchOperations() {
// 一次内存屏障保护多个操作
OSMemoryBarrier();
// 执行多个操作
operation1();
operation2();
operation3();
OSMemoryBarrier();
}
总结要点:
1. 内存屏障类型:
- 完全内存屏障
- 获取屏障(Acquire)
- 释放屏障(Release)
2. 使用场景:
- 锁操作
- 原子操作
- 属性访问
- 引用计数
3. 架构相关:
- ARM 特殊处理
- x86 内存序列
- 不同平台实现
4. 性能影响:
- 内存屏障开销
- 合理使用
- 优化策略
5. 注意事项:
- 正确使用类型
- 避免过度使用
- 考虑性能影响
- 平台兼容性