BinartOCThreadSafeContainers 0.1.0

BinartOCThreadSafeContainers 0.1.0

fallenink维护。



  • fallending

BinartOCThreadSafeContainers

CI Status Version License Platform

示例

要运行示例项目,请克隆仓库,并在Example目录下首先运行pod install

需求

安装

BinartOCThreadSafeContainers通过CocoaPods提供。要安装它,请将以下行添加到Podfile中

pod 'BinartOCThreadSafeContainers'

注意

重复1000次

^synchronized used : 1.628879 
NSLock used : 0.428537 
NSCondition used : 6.428604 
NSConditionLock used : 1.2S6706 
NSRecursiveLock used : 0.590866 
pthread_mutex used : 0.264639 
dispatch_semaphore used : 0.156741 
OSSpinLock used : 0.0688099

OSSpinLock

优先级反转问题

如果一个低优先级的线程获得了锁并访问共享资源,这时一个高优先级的线程也尝试获取这个锁,它将陷入忙等状态从而占用大量CPU。此时低优先级线程无法与高优先级线程争夺CPU时间,从而导致任务长时间无法完成、无法释放锁。这不仅仅是一个理论问题,libobjc已经多次遇到这个问题,因此苹果的工程师放弃了OSSpinLock。

在新版的iOS中,系统维护了五个不同的线程优先级/QoS: background,utility,default,user-initiated,user-interactive。

iOS10以后,苹果提供了新的API

os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
os_unfair_lock_lock(unfairLock);
sleep(4);
os_unfair_lock_unlock(unfairLock);

OSAtomicCompareAndSwap32 + volatile

@interface AClass () {
    byte volatile _lockFlag;
}
@end

while(!OSAtomicCompareAndSwap32(0, 1, &_lockFlag));
sleep(4);
OSAtomicCompareAndSwap32(1, 0, &_lockFlag);

但已被废弃

OSATOMIC_DEPRECATED_REPLACE_WITH(atomic_compare_exchange_strong)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0)
bool OSAtomicCompareAndSwap32( int32_t __oldValue, int32_t __newValue, volatile int32_t *__theValue );

TODOs

目前还没有对锁的性能消耗进行详细的对比,暂时使用YYThreadSafeArray的方案

  1. iOS中各种锁的性能对比
  2. 原子性内存栅栏问题简介

作者

fallending, [email protected]

许可协议

BinartOCThreadSafeContainers可根据MIT许可协议使用。有关更多信息,请参阅LICENSE文件。