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

Multithreading pthread_once()是如何在内部实现的?,multithreading,pthreads,posix,Multithreading,Pthreads,Posix,我们是否在pthread_once()中使用任何锁定机制?在threadsafe singleton类中使用pthread_once()而不是使用pthread_mutex_lock()和pthread_mutex_unlock()的成本是多少?规范没有定义如何实现pthread_once和pthread_mutex_lock,但只定义了它们的行为方式,因此,不同的平台将有不同的实现 通常可以使pthread\u一次比互斥锁更简单(因为它只需要一个原子测试和设置操作,并且没有阻塞),但我也怀疑p

我们是否在pthread_once()中使用任何锁定机制?在threadsafe singleton类中使用pthread_once()而不是使用pthread_mutex_lock()和pthread_mutex_unlock()的成本是多少?

规范没有定义如何实现
pthread_once
pthread_mutex_lock
,但只定义了它们的行为方式,因此,不同的平台将有不同的实现

通常可以使
pthread\u一次
比互斥锁更简单(因为它只需要一个原子测试和设置操作,并且没有阻塞),但我也怀疑
pthread\u互斥锁
可能会得到更多的优化,因为它的使用更广泛


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

您可以直接阅读


您很幸运,因为最近glibc团队统一了跨支持体系结构的所有不同实现。他们能够用现代C代码取代纯汇编,而现代C代码也利用了C11原子支持

听起来似乎可以通过简单的原子读/写来完成。另外,如果我没有看错的话,它似乎根本不会锁定。如果你不想问某个特定的平台,答案是,“pthreads库的设计者认为在这个平台上最好的方式是什么”。