所以我正在阅读这篇文章,试图从 Python 解释器中删除全局解释器锁 (GIL) 以提高多线程性能,并看到了一些有趣的东西。
事实证明,删除 GIL 实际上使事情变得更糟的地方之一是内存管理:
使用自由线程,引用计数操作失去了它们的线程安全性。因此,补丁引入了全局引用计数互斥锁以及用于更新计数的原子操作。在 Unix 上,锁定是使用标准 pthread_mutex_t 锁(包装在 PyMutex 结构中)和以下函数实现的......
...在 Unix 上,必须强调简单的引用计数操作已被不少于三个函数调用以及实际锁定的开销所取代。比它贵很多...
...显然,引用计数的细粒度锁定是导致性能不佳的主要原因,但即使您取消锁定,引用计数性能仍然对任何类型的额外开销(例如,函数调用等)非常敏感.)。在这种情况下,性能仍然是使用 GIL 的 Python 的两倍。
然后:
引用计数对于自由线程来说是一种非常糟糕的内存管理技术。这已经广为人知,但性能数据给出了一个更具体的数字。对于任何尝试 GIL 移除补丁的人来说,这绝对是最具挑战性的问题。
所以问题是,如果引用计数对于线程来说是如此糟糕,那么 Objective-C 是如何做到的呢?我已经编写了多线程 Objective-C 应用程序,并没有注意到内存管理的太多开销。他们在做别的事情吗?像某种对象锁而不是全局锁?Objective-C 的引用计数实际上在技术上对线程不安全吗?作为并发专家,我还不足以真正推测很多,但我有兴趣知道。