iOS - 原子操作

在 Objective-C 运行时中,原子操作主要通过以下几种方式实现:

1. 基本原子操作

objectivec 复制代码
// 原子操作的基本实现
#if __has_feature(c_atomic)

#define OSAtomicIncrement32(p)        __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED)
#define OSAtomicDecrement32(p)        __c11_atomic_sub((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED)
#define OSAtomicIncrement32Barrier(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_SEQ_CST)
#define OSAtomicDecrement32Barrier(p) __c11_atomic_sub((_Atomic(int32_t) *)(p), 1, __ATOMIC_SEQ_CST)

#else

// 使用内联汇编实现原子操作
static ALWAYS_INLINE int32_t 
OSAtomicIncrement32(volatile int32_t *value) {
    return __sync_fetch_and_add(value, 1) + 1;
}

static ALWAYS_INLINE int32_t 
OSAtomicDecrement32(volatile int32_t *value) {
    return __sync_fetch_and_sub(value, 1) - 1;
}

#endif

2. 自旋锁实现

objectivec 复制代码
typedef struct {
    volatile int32_t value;
} OSSpinLock;

// 自旋锁的原子操作
static ALWAYS_INLINE void
OSSpinLockLock(volatile OSSpinLock *lock)
{
    do {
        while (lock->value != 0) {
            // 忙等待
            __asm__ volatile ("pause");
        }
    } while (!OSAtomicCompareAndSwap32(0, 1, &lock->value));
}

static ALWAYS_INLINE bool
OSSpinLockTry(volatile OSSpinLock *lock)
{
    return OSAtomicCompareAndSwap32(0, 1, &lock->value);
}

static ALWAYS_INLINE void
OSSpinLockUnlock(volatile OSSpinLock *lock)
{
    OSAtomicAnd32Barrier(0, &lock->value);
}

3. 比较和交换操作

objectivec 复制代码
// 原子比较和交换操作
static ALWAYS_INLINE bool
OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst)
{
    return __sync_bool_compare_and_swap(dst, oldp, newp);
}

static ALWAYS_INLINE bool
OSAtomicCompareAndSwapLong(long oldl, long newl, volatile long *dst)
{
    return __sync_bool_compare_and_swap(dst, oldl, newl);
}

static ALWAYS_INLINE bool
OSAtomicCompareAndSwap32(int32_t old, int32_t new, volatile int32_t *dst)
{
    return __sync_bool_compare_and_swap(dst, old, new);
}

4. 内存屏障

objectivec 复制代码
// 内存屏障实现
#define OSMemoryBarrier()  __sync_synchronize()

static ALWAYS_INLINE void
OSMemoryBarrierBeforeUnlock()
{
#if defined(__arm__) || defined(__arm64__)
    OSMemoryBarrier();
#endif
}

5. 原子引用计数操作

objectivec 复制代码
inline bool 
objc_object::rootTryRetain()
{
    return sidetable_tryRetain() || rootRetain_overflow(true);
}

inline bool 
objc_object::sidetable_tryRetain()
{
    SideTable& table = SideTables()[this];
    
    bool result = false;
    
    table.lock();
    RefcountMap::iterator it = table.refcnts.find(this);
    if (it != table.refcnts.end()) {
        RefcountMap::value_type &pair = *it;
        if (pair.second & SIDE_TABLE_RC_PINNED) {
            pair.second += SIDE_TABLE_RC_ONE;
            result = true;
        }
        else if (pair.second & SIDE_TABLE_RC_WEAKLY_REFERENCED) {
            pair.second = SIDE_TABLE_RC_ONE | SIDE_TABLE_RC_WEAKLY_REFERENCED;
            result = true;
        }
    }
    table.unlock();
    
    return result;
}

6. 原子属性访问器

objectivec 复制代码
// 原子属性的 getter
id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {
    if (!atomic) return *((id *)((char *)self + offset));
    
    // 原子操作
    spinlock_t& slotlock = PropertyLocks[GOODHASH(offset)];
    slotlock.lock();
    id value = *((id *)((char *)self + offset));
    slotlock.unlock();
    return value;
}

// 原子属性的 setter
static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
                                   ptrdiff_t offset, bool atomic, bool copy) 
{
    if (!atomic) {
        *((id *)((char *)self + offset)) = newValue;
        return;
    }
    
    spinlock_t& slotlock = PropertyLocks[GOODHASH(offset)];
    slotlock.lock();
    *((id *)((char *)self + offset)) = newValue;
    slotlock.unlock();
}

7. 原子操作的使用场景

  1. 引用计数管理
objectivec 复制代码
// 原子递增引用计数
id objc_retain(id obj) {
    if (!obj) return obj;
    if (obj->isTaggedPointer()) return obj;
    return obj->retain();
}
  1. 属性访问
objectivec 复制代码
// 原子属性的实现
@property (atomic) NSString *name;
  1. 数据结构操作
objectivec 复制代码
// 线程安全的数组操作
- (void)addObject:(id)object {
    @synchronized(self) {
        [_array addObject:object];
    }
}

这些原子操作的实现保证了:

  • 原子性:操作要么完全执行,要么完全不执行
  • 可见性:一个线程的修改对其他线程立即可见
  • 有序性:防止指令重排导致的问题

通过这些机制,Objective-C 运行时能够保证多线程环境下的数据一致性和线程安全。

相关推荐
与火星的孩子对话4 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
恋猫de小郭1 天前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
点金石游戏出海1 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生1 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔1 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244801 天前
谈一谈iOS线程管理
ios·objective-c
Digitally1 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智2 天前
IOS 蓝牙连接
macos·ios·cocoa
美狐美颜sdk2 天前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭2 天前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin