首页 > 解决方案 > 为什么 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 个参数是否有意义?设计考虑是什么,想知道更多细节。

非常感谢。

标签: c++c++11parameterslockingscoped-lock

解决方案


不需要两个,它可以锁定一个或多个

cppreference 页面中,您的示例来自(强调我的):

scoped_lock 类是一个互斥体包装器,它提供了一种方便的 RAII 样式机制,用于在作用域块的持续时间内拥有一个或多个互斥体。

std::scoped_lock是获取多个互斥锁的便捷实用程序 - 它将在引擎盖下使用避免死锁的机制。在 C++11 和 C++14 中,我们只有std::lock(),但它不是 RAII 机制(它不会自动解锁互斥锁)。

您也可以使用std::scoped_lock单个互斥锁,然后它就相当于std::lock_guard


推荐阅读