本篇介紹一下一般各個作業系統的 C++ 編譯器是怎麼實作 std::condition_variable 的。
接下來我們來 trace llvm 的 libc++ 是怎麼實作 std::condition_variable 的。
1. std::condition_variable::notify_one 的實作
notify_one
轉換成內部的 __libcpp_condvar_signal
1 | void |
1-1. std::condition_variable::notify_one 在 unix 平台的實作內容
__libcpp_condvar_signal
在 unix 平台是呼叫 pthread_cond_signal
1 | int __libcpp_condvar_signal(__libcpp_condvar_t *__cv) |
1-2. std::condition_variable::notify_one 在 windows 平台的實作內容
__libcpp_condvar_signal
在 windows 平台是呼叫 WakeConditionVariable
1 | int __libcpp_condvar_signal(__libcpp_condvar_t *__cv) |
2. std::condition_variable::wait 的實作
wait
轉換成內部的 __libcpp_condvar_wait
1 | void |
2-1. std::condition_variable::wait 在 unix 平台的實作內容
__libcpp_condvar_wait
在 unix 平台是呼叫 pthread_cond_wait
1 | int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) |
2-2. std::condition_variable::wait 在 windows 平台的實作內容
__libcpp_condvar_wait
在 windows 平台是呼叫 SleepConditionVariableSRW
1 | int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) |
總結
在一番 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 在各平台下如何實現?