C++11 std::mutex блокирует тот же поток

Я сейчас изучаю (освежаю) C++. В рамках освежения я попытался проверить std::mutex Поведение мной ниже кода. Это в основном пытается сделать "Руководство lock / unlock ',' std::lock_guard над mutex ' а также ' try_lock над std::mutex ". Когда я ссылаюсь std::mutex::try_lock, он говорит, что если тот же поток пытается заблокировать снова, это тупик. Но я проверяю try_lock(), который согласно приведенному выше описанию ссылки, он должен дать false, Но почему-то, std::mutex возможность заблокировать уже заблокирован mutex, Я попытался Google / Stackru, не смог найти причину этого поведения. Не могли бы вы дать мне знать, почему std::mutex возможность заблокировать снова после блокировки в той же теме?

Код:

#include <iostream>
#include <mutex>

template <typename BASICLOCKABLE>
void ManualLockUnlock(BASICLOCKABLE & mut, std::string msg)
{
    mut.lock();
    std::cout << msg << "Manually locked, unlocked\n";

    if(mut.try_lock())
    {
        std::cout << msg << "able to try_lock after manual lock\n";
        mut.unlock();
    }
    else
    {
        std::cout << msg << "UNABLE to try_lock after manual lock\n";
    }
    mut.unlock();
    std::cout << std::endl;
}

template <typename BASICLOCKABLE>
void lock_guard(BASICLOCKABLE & mut, std::string msg)
{
    std::lock_guard<BASICLOCKABLE> lc(mut);
    std::cout << msg << "lock_guard locked, unlocked\n";

    if(mut.try_lock())
    {
        std::cout << msg << "able to try_lock again inside lock_guard\n";
        mut.unlock();
    }
    else
    {
        std::cout << msg << "UNABLE to try_lock again inside lock_guard\n";
    }
    {
        std::lock_guard<BASICLOCKABLE> lc2(mut);
        std::cout << msg << "SECOND LEVEL lock_guard locked, unlocked\n";
    }
    std::cout << std::endl;
}

template <typename BASICLOCKABLE>
void try_lock(BASICLOCKABLE & mut, std::string msg)
{
    mut.try_lock();
    std::cout << msg << "try_lock locked, unlocked\n";

    if(mut.try_lock())
    {
        std::cout << msg << "able to try_lock again inside try_lock\n";
        mut.unlock();
    }
    else
    {
        std::cout << msg << "UNABLE to try_lock again inside try_lock\n";
    }

    mut.unlock();
    std::cout << std::endl;
}

int main()
{
    std::string msg;

    std::mutex mut;
    msg = "std::mutex ";
    ManualLockUnlock(mut, msg);
    lock_guard(mut, msg);
    try_lock(mut, msg);

    std::recursive_mutex    recMut;
    msg = "std::recursive_mutex ";

    ManualLockUnlock(recMut, msg);
    lock_guard(recMut, msg);
    try_lock(recMut, msg);
}

Команда компиляции:

g++ lock_guard.cpp -std=c++11

Выход:

std::mutex Manually locked, unlocked
std::mutex able to try_lock after manual lock

std::mutex lock_guard locked, unlocked
std::mutex able to try_lock again inside lock_guard
std::mutex SECOND LEVEL lock_guard locked, unlocked

std::mutex try_lock locked, unlocked
std::mutex able to try_lock again inside try_lock

std::recursive_mutex Manually locked, unlocked
std::recursive_mutex able to try_lock after manual lock

std::recursive_mutex lock_guard locked, unlocked
std::recursive_mutex able to try_lock again inside lock_guard
std::recursive_mutex SECOND LEVEL lock_guard locked, unlocked

std::recursive_mutex try_lock locked, unlocked
std::recursive_mutex able to try_lock again inside try_lock

Компилятор, который я использую:

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0 ответов

Другие вопросы по тегам