std::condition_variable 怎麼實作的?

本篇介紹一下一般各個作業系統的 C++ 編譯器是怎麼實作 std::condition_variable 的。

接下來我們來 trace llvm 的 libc++ 是怎麼實作 std::condition_variable 的。

1. std::condition_variable::notify_one 的實作

notify_one 轉換成內部的 __libcpp_condvar_signal

libcxx/src/condition_variable.cpplink
1
2
3
4
5
void
condition_variable::notify_one() _NOEXCEPT
{
__libcpp_condvar_signal(&__cv_);
}

1-1. std::condition_variable::notify_one 在 unix 平台的實作內容

__libcpp_condvar_signal 在 unix 平台是呼叫 pthread_cond_signal

libcxx/include/__threading_supportlink
1
2
3
4
int __libcpp_condvar_signal(__libcpp_condvar_t *__cv)
{
return pthread_cond_signal(__cv);
}

1-2. std::condition_variable::notify_one 在 windows 平台的實作內容

__libcpp_condvar_signal 在 windows 平台是呼叫 WakeConditionVariable

libcxx/src/support/win32/thread_win32.cpplink
1
2
3
4
5
int __libcpp_condvar_signal(__libcpp_condvar_t *__cv)
{
WakeConditionVariable((PCONDITION_VARIABLE)__cv);
return 0;
}

2. std::condition_variable::wait 的實作

wait 轉換成內部的 __libcpp_condvar_wait

libcxx/src/condition_variable.cpplink
1
2
3
4
5
6
7
8
9
10
void
condition_variable::wait(unique_lock<mutex>& lk) _NOEXCEPT
{
if (!lk.owns_lock())
__throw_system_error(EPERM,
"condition_variable::wait: mutex not locked");
int ec = __libcpp_condvar_wait(&__cv_, lk.mutex()->native_handle());
if (ec)
__throw_system_error(ec, "condition_variable wait failed");
}

2-1. std::condition_variable::wait 在 unix 平台的實作內容

__libcpp_condvar_wait 在 unix 平台是呼叫 pthread_cond_wait

libcxx/include/__threading_supportlink
1
2
3
4
int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m)
{
return pthread_cond_wait(__cv, __m);
}

2-2. std::condition_variable::wait 在 windows 平台的實作內容

__libcpp_condvar_wait 在 windows 平台是呼叫 SleepConditionVariableSRW

libcxx/src/support/win32/thread_win32.cpplink
1
2
3
4
5
int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m)
{
SleepConditionVariableSRW((PCONDITION_VARIABLE)__cv, (PSRWLOCK)__m, INFINITE, 0);
return 0;
}

總結

在一番 trace code 的結果後,std::condition_variable 在 llvm 的 libc++ 實作是這樣的,
在 unix 下
std::condition_variable::notify_one 轉換成 pthread_cond_signal
std::condition_variable::wait 轉換成 pthread_cond_wait
在 windows 下
std::condition_variable::notify_one 轉換成 WakeConditionVariable
std::condition_variable::wait 轉換成 SleepConditionVariableSRW

相關主題
C/C++ 新手入門教學懶人包
std::thread 怎麼實作的?
std::mutex 怎麼實作的?
C++11 在各平台下如何實現?