Fro*_*art 1 c++ multithreading c++11 c++14
假设我们有以下代码:
#include <mutex>
#include <thread>
std::mutex m;
void foo()
{
m.lock();
}
int main()
{
std::thread th(foo);
m.lock();
th.join();
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码包含死锁,但我想知道C++标准中的以下语句:
30.4.1.2互斥体类型[thread.mutex.requirements.mutex]
6表达式m.lock()应格式正确,并具有以下语义:
[...]
12抛出:需要异常时的system_error(30.2.2).
13错误条件:
- (13.1)operation_not_permitted - 如果线程没有执行操作的权限.
- (13.2)resource_deadlock_would_occur - 如果实现检测到会发生死锁.
- (13.3)device_or_resource_busy - 如果互斥锁已被锁定且无法阻塞.
我们可以看到,违反其中一条规则会导致异常:
30.2.2异常[thread.req.exception]
1本条款中描述的某些函数被指定为抛出system_error类型的异常(19.5.7). 如果检测到任何函数的错误条件,或者对操作系统或其他基础API的调用导致错误导致库函数无法满足其规范,则应抛出此类异常
我提供的代码肯定包含死锁.在这种情况下,标准库是否应抛出异常(因为g ++和Visual C++不这样做)?如果没有,为什么?因为从我的观点来看,它似乎属于13.2(resource_deadlock_would_occur)或13.3(device_or_resource_busy)类别.
您应该编写代码来处理死锁异常,但不要依赖它们来解决死锁.无法保证会抛出死锁异常,因为无法保证检测到它们.换句话说,实现不必检测死锁,它只是可以,并且如果找到它们就是如何处理它们的.这并不意味着他们会被发现.
死锁代码是一个逻辑错误,不要编写可以死锁的代码.
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |