一、死锁概念 

只有两个互斥量才会产生死锁问题。

    举个例子:

    两个锁——金锁,银锁和两个线程A,B

    (1)A执行时,这个线程先锁金锁,把金锁Lock()成功了,然后它去lock银锁。

    出现了上下文切换

    (2)B执行了,这个线程先锁银锁,因为银锁还没有被锁,所以银锁lock()成功了,B然后就去lock金锁。

此时,死锁就产生了,两个线程互相锁住。

    (3)A因为拿不到银锁头,流程走不下去;

    (4)B因为拿不到金锁头,流程也走不下去。

二、死锁演示

示例,创建了两个Mutex:


#include <iostream>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
using namespace std;

class A {
public:
    // 收集数据的函数
    void inMsgRecvQueue()
    {
        for (int i = 0; i < 100000; ++i)
        {
            cout << "inMsgRecvQueue()执行,插入一个元素" << i << endl;
            my_mutex1.lock();
            my_mutex2.lock();

            msgRecvQueue.push_back(i);

            my_mutex2.unlock();
            my_mutex1.unlock();
        }
        return;
    }
    bool outMsgLULPro(int& command)
    {
        //std::lock_guard<std::mutex> sbguard(my_mutex); // 
        my_mutex2.lock();
        my_mutex1.lock();
        if (!msgRecvQueue.empty())
        {
            // 取数据 & 去除这个数据
            command = msgRecvQueue.front();
            msgRecvQueue.pop_front();
            my_mutex1.unlock();
            my_mutex2.unlock();

            return true;
        }
        my_mutex1.unlock();
        my_mutex2.unlock();
        return false;
    }

    // 取出数据的线程
    void outMsgRescQueue()
    {
        int command = 0;

        for (int i = 0; i < 100000; ++i)
        {
            bool result = outMsgLULPro(command);
            if (result == true)
            {
                cout << "outMsgRescQueue()执行,取出一个元素" << command << endl;
            }
            else
            {
                cout << "outMsgRescQueue()执行,但目前消息队列为空" << i << endl;
            }
        }
        cout << "end" << endl;
    }

private:
    std::list<int> msgRecvQueue; // 命令接收list
    st
10-30 17:53