为什么 libc++ call_once 对所有调用使用共享互斥体?

问题描述 投票:0回答:0

我正在阅读 libc++

call_once
的源代码,并对共享互斥锁的用法感到好奇。这是
mutex.cpp
里面的实现。这是否意味着
call_once(f1)
call_once(f2)
竞争相同的互斥锁,即使它们是不同的函数。谢谢。

#ifndef _LIBCPP_HAS_NO_THREADS
_LIBCPP_SAFE_STATIC static __libcpp_mutex_t mut = _LIBCPP_MUTEX_INITIALIZER;
_LIBCPP_SAFE_STATIC static __libcpp_condvar_t cv = _LIBCPP_CONDVAR_INITIALIZER;
#endif

void __call_once(volatile once_flag::_State_type& flag, void* arg,
                 void (*func)(void*)) {
  __libcpp_mutex_lock(&mut);
  ...
}

我希望有人能澄清这是否是故意的,如果是这样,背后的原因是什么。

c++ multithreading libc++ std-call-once
© www.soinside.com 2019 - 2024. All rights reserved.