Мне действительно интересно, зачем вам вообще это нужно;)
Обычно вам нужно что-то вроде
lock();
do_critical_task();
unlock();
(В C ++ блокировка / разблокировка часто скрывается с помощью std::lock_guard
или подобного.)
Предположим, что один поток (скажем, поток A) вызвал этот код и находится внутри критической задачи, т.е. он также удерживает блокировку. Затем, если вы разблокируете тот же мьютекс из другого потока, любой поток, кроме A, также может войти в критическую секцию одновременно.
Основная цель мьютексов - иметь взаимное исключение (отсюда их название), поэтому все, что вы do - это стереть назначение мьютекса;)
Тем не менее: вы всегда должны верить стандарту. Только если что-то работает в определенной системе, это не значит, что она портативна. Плюс: особенно в параллельном контексте, многое может сработать тысячу раз, но затем выйдет из строя в 1001-й раз из-за условий гонки. В математике вашу попытку можно было бы сравнить с «доказательством на примере».