【问题标题】:Why c++11 std::lock and std::scoped_lock need at least 2 parameters?为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
【发布时间】:2020-01-26 10:56:37
【问题描述】:

刚刚发现这 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++11 parameters locking scoped-lock


    【解决方案1】:

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

    来自cppreference page,你的例子来自(强调我的):

    scoped_lock 类是一个互斥体包装器,它提供了一种方便的 RAII 风格在作用域块期间拥有一个或多个互斥体的机制。

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

    您也可以将std::scoped_lock 与单个互斥锁一起使用,然后它就等同于std::lock_guard

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-03
      • 2016-09-07
      • 1970-01-01
      • 2016-03-14
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多