gpt4 book ai didi

c++11 - 为什么C++中std::mutex的构造函数不抛出异常?

转载 作者:行者123 更新时间:2023-12-02 23:05:46 24 4
gpt4 key购买 nike

pthread_mutex_init() 函数在初始化互斥体失败时返回一个非零值,而 C++11 中的 std::mutex 类有一个noexcept 的构造函数。

假设选择在 pthreads 互斥体之上实现 C++ 互斥体类。他在类中包装了一个 pthread 互斥体,并尝试通过在构造函数中调用 pthread_mutex_init() 来初始化它。如果函数调用返回一个非零值(意味着错误),则无法立即报告错误,因为构造函数无法抛出异常。一种替代方法是抛出异常,直到实际在互斥锁上调用锁定方法。但这种方法似乎是错误的。

是否有另一种方法可以做到这一点,采用一些巧妙的技巧来保证初始化互斥体总是成功?

更新:我将回答我自己的问题。根据language standard ,在 30.4.1.3 pge 1163 中,它说“。如果互斥类型的对象初始化失败,则应抛出 system_error 类型的异常。”

而noexcept函数可以在函数体内部抛出异常,只是调用者无法捕获异常。如果 noexcept 函数内抛出异常,则将调用 std::terminate。

最佳答案

std::mutex 的构造函数需要是 constexpr (以便可以静态初始化和使用全局 std::mutex在其他全局对象的构造函数中),因此根本无法调用 pthread_mutex_init (或类似函数)。

相反,它需要使用 PTHREAD_MUTEX_INITIALIZER 或等效项(例如,Windows 上的 SRWLOCK_INIT)来静态初始化互斥体。

关于c++11 - 为什么C++中std::mutex的构造函数不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48698031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com