c++ - 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
问题描述
刚刚发现这2个utils至少需要2个参数,例如2个互斥锁。
需要是这样的(来自 cppreference.com):
void assign_lunch_partner(Employee &e1, Employee &e2)
{
static std::mutex io_mutex;
{
std::lock_guard<std::mutex> lk(io_mutex);
std::cout << e1.id << " and " << e2.id << " are waiting for locks" << std::endl;
}
{
std::scoped_lock lock(e1.m, e2.m);
}
}
至少需要 2 个参数是否有意义?设计考虑是什么,想知道更多细节。
非常感谢。
解决方案
它不需要两个,它可以锁定一个或多个。
从cppreference 页面中,您的示例来自(强调我的):
scoped_lock 类是一个互斥体包装器,它提供了一种方便的 RAII 样式机制,用于在作用域块的持续时间内拥有一个或多个互斥体。
std::scoped_lock
是获取多个互斥锁的便捷实用程序 - 它将在引擎盖下使用避免死锁的机制。在 C++11 和 C++14 中,我们只有std::lock()
,但它不是 RAII 机制(它不会自动解锁互斥锁)。
您也可以使用std::scoped_lock
单个互斥锁,然后它就相当于std::lock_guard
推荐阅读
- node.js - Node.js 重定向 GET 请求丢失 Origin 标头
- json - 无法在列表视图中加载变量
- python - Cassandra python 驱动程序 - 使用对象映射器冻结
- c - clflush 通过 C 函数使缓存行无效
- angular - 如何在 ng-select angular 5 中对 ng-select 匹配的记录进行排序
- alexa - 如何在 Alexa Skill 中为航班代码定义自定义插槽类型?
- tfs - 无法获取经过身份验证的令牌以运行具有计划类型构建和标识符项目集合构建服务的作业 __default
- android - 如何使用edittext验证json数组
- php - Wordpress 获取每个帖子的特定类别的术语并显示它
- java - 暂停暂停的线程并在 JVM 重新启动后恢复它