2015-09-07 2 views
2

Вот кодЕсли операция мьютекса бросает system_error для блокировки дважды?

mutex mtx; 
try{ 
    mtx.lock(); 
    mtx.lock(); 
}catch(system_error& e){ 
    mtx.unlock(); 
    cout << e.what() << '\n'; 
    cout << e.code() << '\n'; 
} 

Выход device or resource busy, generic: 16, как ожидается, но никогда не видел.

gcc версия 4.8.4

p.s.

Код, указанный выше, из книги Бьярна Страуструпа - язык программирования на С ++, ошибка 42.3.1.2 mutex. Согласно книге, должен появиться системный_error. Этот вопрос о «неопределенном поведении» публикуется в 2012 году, даже до публикации книги.

+0

Почему вы ожидаете 'system_error' быть выброшен? – juanchopanza

+0

[Не вижу ничего здесь, когда вы бросаете исключения.] (Http://en.cppreference.com/w/cpp/thread/mutex) – user4581301

+4

«Если блокировка вызывается потоком, который уже владеет мьютексом, поведение не определено: программа * может * тупиковая ситуация, или, если реализация может обнаружить тупик, может возникнуть условие ошибки resource_deadlock_would_occur. " – melak47

ответ

2

Это неопределенное поведение. Если мы посмотрим на [mutex.requirements.mutex], у него есть предпосылка, что вызывающий поток выполняет , а не собственный мьютекс, и постусловие, что вызывающий поток делает собственными мьютексами. device_or_resource_busy относится к тому, когда ANOTHER вызывающий поток пытается заблокировать мьютексы. Тем не менее, это определяется реализацией, выбрасывается ли resource_deadlock_would_occur.

Этот вопрос является дубликатом Why is locking a std::mutex twice 'Undefined Behaviour'?

Смежные вопросы