BinartOCThreadSafeContainers
示例
要运行示例项目,请克隆仓库,并在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的方案
作者
fallending, [email protected]
许可协议
BinartOCThreadSafeContainers可根据MIT许可协议使用。有关更多信息,请参阅LICENSE文件。