pthread_once() 内部是如何实现的?

How pthread_once() is implemented internally?

我们在 pthread_once() 中使用任何锁定机制吗?在线程安全单例 class 中使用 pthread_once() 而不是使用 pthread_mutex_lock() 和 pthread_mutex_unlock() 的成本是多少?

规范没有定义 pthread_oncepthread_mutex_lock 必须如何实现,只定义了它们的行为方式,因此不同的平台会有不同的实现。

通常可以使 pthread_once 比互斥锁更简单(因为它只需要一个原子 test-and-set 操作,并且没有阻塞),但我也怀疑 pthread_mutex_lock 可能得到了更多的优化,因为它被更广泛地使用。

如果您关心性能,则必须编写一个基准测试并 运行 它在您的目标平台上,然后选择速度更快的那个。

可以直接阅读 pthread_once

的glibc实现

你很幸运,因为最近 glibc 团队在支持的架构中统一了所有不同的实现。他们能够用同样利用 C11 原子支持的现代 C 代码替换纯汇编