【发布时间】:2018-02-09 02:51:12
【问题描述】:
pthread_mutex_init()函数在初始化互斥锁失败时返回一个非零值,而C++11中的std::mutex类有noexcept的构造函数。
假设一个人选择在 pthreads 互斥锁之上实现一个 C++ 互斥锁类。他在类中包装了一个 pthread 互斥锁,并尝试通过在构造函数中调用 pthread_mutex_init() 来初始化它。如果函数调用返回一个非零值,即错误,由于构造函数不能抛出,所以不能立即报告错误。一种替代方法是在互斥体上实际调用锁定方法之前抛出异常。但这种方法似乎是错误的。
还有其他方法可以做到这一点,采用一些巧妙的技巧来保证初始化互斥锁总是成功吗?
更新:我将在这个问题上回答我自己的问题。根据language standard,在 30.4.1.3 pge 1163 中,它说“。如果一个 mutex 类型的对象初始化失败,将抛出一个 system_error 类型的异常。”
并且noexcept的函数可以在函数体内抛出,只是调用者无法捕捉到异常。如果在 noexcept 函数中抛出异常,将调用 std::terminate。
【问题讨论】:
-
根据this document,“第1163页第30.4.1.2节,互斥类型的成员函数报告的错误代码的错误条件(如果有)应为:-resource_unavailable_try_again; operation_not_permitted ... device_or_reso
-
好问题,顺便说一句。
-
@Steve 我不明白。根据该文档,在 30.4.1.3 pge 1163 中,它说“。如果互斥锁类型的对象初始化失败,则应抛出 system_error 类型的异常。”但互斥锁构造函数不能抛出。
-
@JohnZ.Li:自己的问题自己回答就可以了,如果没有人给出更好的答案,你甚至可以接受。请但是,请不要将答案放在您的问题中。这使得这个问题看起来没有答案。
-
请注意,
std::mutex不要求必须使用POSIX线程实现,即pthread库。