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.