【问题标题】:Several mutexes locking in c++c++中的几个互斥锁
【发布时间】:2017-05-31 10:51:34
【问题描述】:

在很多地方都有使用 std::defer_lock 的建议:

{
    std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
    std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
    std::lock(lk1, lk2);
    //Do some stuff
}

但如果我不使用 std::defer_lock 并尝试简单地这样做会怎样:

{
    std::unique_lock<std::mutex> lk1(mutex1);
    std::unique_lock<std::mutex> lk2(mutex2);
    //Do some stuff
}

据我所知,这段代码将锁定 mutex1,然后锁定 mutex2。解锁将以相反的顺序执行 - mutex2,然后是 mutex1。没有理由陷入僵局。

文档说 std::lock(lk1, lk2);在第一个示例中,将同时锁定互斥锁。那么,这是某种优化吗?

【问题讨论】:

  • 在这种情况下,应该不需要std::lock 所做的死锁避免。

标签: c++ multithreading c++11 mutex


【解决方案1】:

死锁问题是锁定多个互斥锁的顺序问题。这在简单的应用程序中可能很明显,但在更复杂的情况下(或太复杂)非常困难,其中互斥锁可能并不总是锁定在同一个功能上,并且它们通常不称为 lk1,lk2,......所以通过同时锁定,您不会造成两个线程等待锁定的互斥锁的情况,因此无法解锁它们锁定的互斥锁。

您可能希望避免混合互斥锁,但这可能会导致其他棘手的情况。但是如果可能,最好让线程工作在独立状态,让 1 个控制线程累积结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2011-01-21
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多