该pthread_mutex_init()
函数在初始化互斥锁失败时返回一个非零值,而std::mutex
C++11 中的类具有noexcept
.
假设一个人选择在 pthreads 互斥体之上实现一个 C++ 互斥体类。他在类中包装了一个 pthread 互斥锁,并尝试通过在构造函数中调用 pthread_mutex_init() 来初始化它。如果函数调用返回一个非零值,即错误,由于构造函数不能抛出,所以不能立即报告错误。一种替代方法是在互斥体上实际调用锁定方法之前抛出异常。但这种方法似乎是错误的。
有没有另一种方法来做到这一点,采用一些巧妙的技巧来保证初始化互斥锁总是成功的?
更新:我将在这个问题上回答我自己的问题。根据语言标准,在 30.4.1.3 pge 1163 中,它说“。如果互斥锁类型的对象初始化失败,则应抛出 system_error 类型的异常。”
而noexcept的函数可以在函数体内抛出,只是调用者无法捕捉到异常。如果在 noexcept 函数内抛出异常,则将调用 std::terminate。