小编Fro*_*art的帖子

为什么没有lock()在死锁的情况下抛出异常

假设我们有以下代码:

#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)类别.

c++ multithreading c++11 c++14

1
推荐指数
1
解决办法
612
查看次数

C 和 C++ 中的几个一元运算符

使用像这样的表达式是否符合标准

int i = 1;
+-+-+i;
Run Code Online (Sandbox Code Playgroud)

以及如何确定 i 变量的符号?

c c++

0
推荐指数
1
解决办法
307
查看次数

是否有任何键值容器存储其元素而不进行任何重新排序

是否有任何键值容器存储其元素而不需要重新排序,这与std :: map和std :: unordered_map不同?我不想使用std :: vector btw.也许提升?

c++

0
推荐指数
1
解决办法
60
查看次数

如何在Ruby on Rails中执行6.months.ago - 1.days.ago

如何在Ruby on Rails 4.1.4中实现以下行为?

Purchase.where('purchase_date <= ?', 6.months.ago - 1.days.ago).each do |purchase|
    # ...
end
Run Code Online (Sandbox Code Playgroud)

提前致谢.

ruby ruby-on-rails ruby-on-rails-4

0
推荐指数
1
解决办法
1130
查看次数

在iOS项目中,Swift中常量的最佳位置是什么

iOS项目中Swift中常量的最佳位置是什么?例如,我需要为错误域名和错误代码创建常量.

我应该使用全局常量还是类似Constants静态字段的类?

提前致谢.

swift

0
推荐指数
1
解决办法
107
查看次数

如何在 Windows 窗体中的 TextBox 中心显示文本

TextBox在 Windows 窗体应用程序中有多行控件,我想在该TextBox区域的中心(水平和垂直)显示一些文本。我怎样才能实现这种行为?

提前致谢。

c# winforms

0
推荐指数
1
解决办法
3万
查看次数

C/C++ 中枚举作为函数参数

有人可以给我一个例子,我们真的需要一个枚举作为函数中的参数吗?

c c++

-5
推荐指数
1
解决办法
1万
查看次数

标签 统计

c++ ×4

c ×2

c# ×1

c++11 ×1

c++14 ×1

multithreading ×1

ruby ×1

ruby-on-rails ×1

ruby-on-rails-4 ×1

swift ×1

winforms ×1