pthread_once() 内部是如何实现的?
How pthread_once() is implemented internally?
我们在 pthread_once() 中使用任何锁定机制吗?在线程安全单例 class 中使用 pthread_once() 而不是使用 pthread_mutex_lock() 和 pthread_mutex_unlock() 的成本是多少?
规范没有定义 pthread_once
和 pthread_mutex_lock
必须如何实现,只定义了它们的行为方式,因此不同的平台会有不同的实现。
通常可以使 pthread_once
比互斥锁更简单(因为它只需要一个原子 test-and-set 操作,并且没有阻塞),但我也怀疑 pthread_mutex_lock
可能得到了更多的优化,因为它被更广泛地使用。
如果您关心性能,则必须编写一个基准测试并 运行 它在您的目标平台上,然后选择速度更快的那个。
可以直接阅读 pthread_once
的glibc实现
你很幸运,因为最近 glibc 团队在支持的架构中统一了所有不同的实现。他们能够用同样利用 C11 原子支持的现代 C 代码替换纯汇编
我们在 pthread_once() 中使用任何锁定机制吗?在线程安全单例 class 中使用 pthread_once() 而不是使用 pthread_mutex_lock() 和 pthread_mutex_unlock() 的成本是多少?
规范没有定义 pthread_once
和 pthread_mutex_lock
必须如何实现,只定义了它们的行为方式,因此不同的平台会有不同的实现。
通常可以使 pthread_once
比互斥锁更简单(因为它只需要一个原子 test-and-set 操作,并且没有阻塞),但我也怀疑 pthread_mutex_lock
可能得到了更多的优化,因为它被更广泛地使用。
如果您关心性能,则必须编写一个基准测试并 运行 它在您的目标平台上,然后选择速度更快的那个。
可以直接阅读 pthread_once
的glibc实现你很幸运,因为最近 glibc 团队在支持的架构中统一了所有不同的实现。他们能够用同样利用 C11 原子支持的现代 C 代码替换纯汇编