ibireme / YYCache

High performance cache framework for iOS.
MIT License
2.37k stars 505 forks source link

为什么不用dispatch_semaphore_t 而改用pthread_mutex_t #93

Open mitchell-dream opened 7 years ago

mitchell-dream commented 7 years ago

是否有其他考量?@ibireme

faimin commented 6 years ago

holybin commented 6 years ago

这里有说:https://lision.me/yycache/。 一开始用OSSpinLock的,后面有人在 Github 向作者提 issue 反馈 OSSpinLock 不安全,经过作者的确认(详见 不再安全的 OSSpinLock)最后选择用 pthread_mutex 替代 OSSpinLock。

而为什么不用信号量,原因是信号量不可重入,重入会导致死锁。而mutex可以设置可重入来规避重入时的死锁问题,这才是原因。从性能上他俩区别并不大。

image

iStig commented 6 years ago

上面的回答感觉都是在回答为什么不用 osspinlock。 作者博客有提到 https://blog.ibireme.com/2015/10/26/yycache/ OSSpinLock 自旋锁,性能最高的锁。原理很简单,就是一直 do while 忙等。它的缺点是当等待时会消耗大量 CPU 资源,所以它不适用于较长时间的任务。对于内存缓存的存取来说,它非常合适。

dispatch_semaphore 是信号量,但当信号总量设为 1 时也可以当作锁来。在没有等待情况出现时,它的性能比 pthread_mutex 还要高,但一旦有等待情况出现时,性能就会下降许多。相对于 OSSpinLock 来说,它的优势在于等待时不会消耗 CPU 资源。对磁盘缓存来说,它比较合适。 这里可以把pthread_mutex_t 看作 osspinlock来理解

doubleLLL3 commented 2 years ago

dispatch_semaphore 是信号量,但当信号总量设为 1 时也可以当作锁来。在没有等待情况出现时,它的性能比 pthread_mutex 还要高,但一旦有等待情况出现时,性能就会下降许多。相对于 OSSpinLock 来说,它的优势在于等待时不会消耗 CPU 资源。对磁盘缓存来说,它比较合适。 这里可以把pthread_mutex_t 看作 osspinlock来理解

请问pthread_mutex_t不是属于互斥锁吗?而osspinlock是自旋锁,两者区别应该很大吧?

然后作者在这个Commit里,同时使用pthread_mutex和dispatch_semaphore,不知道两者的差异在哪里,为什么区分使用呢?

望大佬们解惑。