thrd_busy и mtx_lock () / mtx_timedlock () - PullRequest
4 голосов
/ 11 июня 2011

У меня есть следующие вопросы о мьютексах C1x (§7.25.4):

В каких ситуациях mtx_lock() может вернуть thrd_busy вместо блокировки? В каких ситуациях mtx_timedlock() может вернуть thrd_busy?

Обратите внимание, что thrd_busy определено в §7.25.1 as5 как возвращаемое ", когда ресурс, запрошенный функцией test и return, уже используется ".

Я бы ожидал, что thrd_busy будет возвращен только mtx_trylock(), или, самое большее, также mtx_lock() при вызове с мьютексом mtx_try или mtx_try | mtx_recursive, но определенно не из mtx_timedlock(), что требует мьютекс, который поддерживает тайм-аут, то есть мьютекс mtx_timed или mtx_timed | mtx_recursive.

Это просто и недосмотр в проекте? Или я что-то упустил?

Ответы [ 2 ]

6 голосов
/ 27 июня 2011

Если мьютекс не является рекурсивным, но вы пытаетесь заблокировать его рекурсивным способом, то поведение не определено. Однако реализация может обнаружить это и вернуть thrd_busy. (В качестве альтернативы он может навсегда заблокировать или вернуть thrd_error, или thrd_success, или отформатировать жесткий диск .....)

1 голос
/ 18 августа 2014
  1. mtx_lock () не возвращает thrd_busy, однако функция mtx_trylock возвращает thrd_busy, если запрошенный ресурс уже используется.
  2. mtx_timedlock () не возвращает thrd_busy. Функция mtx_timedlock возвращает thrd_success в случае успеха или thrd_timedout, если указанное время было достигнуто без получения запрошенного ресурса, или thrd_error, если запрос не может быть выполнен.
...