https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107857
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Could you please run this and paste the output here? #include <mutex> #include <shared_mutex> #include <condition_variable> #include <iostream> #include <processthreadsapi.h> unsigned long muh_handles() { unsigned long n = 0; if (GetProcessHandleCount(GetCurrentProcess(), &n)) return n; throw; } int main() { int start, end; start = muh_handles(); { std::mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::mutex: " << (end - start) << std::endl; start = end; { std::recursive_mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::recursive_mutex: " << (end - start) << std::endl; start = end; { std::timed_mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::timed_mutex: " << (end - start) << std::endl; start = end; { std::recursive_timed_mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::recursive_timed_mutex: " << (end - start) << std::endl; start = end; { std::shared_mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::shared_mutex: " << (end - start) << std::endl; start = end; { std::shared_timed_mutex m; m.lock(); m.unlock(); } end = muh_handles(); std::cout << "Handles leaked by std::shared_timed_mutex: " << (end - start) << std::endl; start = end; { std::mutex m; std::unique_lock<std::mutex> l(m); std::condition_variable cv; cv.wait_for(l, std::chrono::seconds(0)); } end = muh_handles(); std::cout << "Handles leaked by std::condition_variable: " << (end - start) << std::endl; } I tried to check it on Wine, but the Windows function isn't implemented: 012c:fixme:process:NtQueryInformationProcess ProcessHandleCount (0xffffffffffffffff,0x7ffffe2ffdfc,0x00000004,(nil)) stub