互斥锁 形成死锁实例

Posted walnuttree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互斥锁 形成死锁实例相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <mutex>
#include <thread>

std::mutex coutMutex;

int main(){

    std::thread t([]{
                      std::cout << "Still waiting ..." << std::endl;
                      std::lock_guard<std::mutex> lockGuard(coutMutex);
                      std::cout << std::this_thread::get_id() << std::endl;
                  }
    );

    {
        std::lock_guard<std::mutex> lockGuard(coutMutex);
        std::cout << std::this_thread::get_id() << std::endl;
        t.join();
    }

}

技术图片

lock_guard 相当于 lock 和 unlock,在代码段结束或者函数结束时unlock,因此在主线程中已经对 std::cout 流进行了加锁,在代码段输出 “Still Waiting” 后,尝试对std::cout 进行加锁时,会导致失败,等待资源。
改进措施:

{
  t.join();
  std::lock_guard<std::mutex> lockGuard(coutMutex);
  std::cout << std::this_thread::get_id() << std::endl;
}
{
  {
    std::lock_guard<std::mutex> lockGuard(coutMutex);
    std::cout << std::this_thread::get_id() << std::endl;
  }
  t.join();
}

英文博客地址 : https://www.modernescpp.com/index.php/prefer-locks-to-mutexes
lock_guard 和 unique_guard 的讲解:https://www.jianshu.com/p/34d219380d90

以上是关于互斥锁 形成死锁实例的主要内容,如果未能解决你的问题,请参考以下文章

python学习第33天

Linux:详解多线程(线程安全互斥和死锁)

golang-锁-死锁,互斥锁,读写锁

五互斥量概念用法死锁

No.36协程

死锁模拟