Разблокировка уже разблокированной темы

В уже работающем старом коде я нашел место, где они пытались разблокировать уже разблокированный мьютекс.

Я ясно, что разблокировка уже разблокированного мьютекса приведет к неопределенному поведению.

Но мои сомнения

  1. Могу ли я предсказать поведение, проверив документацию компилятора?
  2. Есть ли вероятность, что это может привести к блокировке потока (взаимоблокировке)?
  3. Неопределенное поведение будет видно на pthread_mutex_unlock где он разблокировал уже разблокированную ветку? Или неопределенное поведение можно увидеть на любом из следующих вызовов pthread?

1 ответ

Решение

Могу ли я предсказать поведение, проверив документацию компилятора?

Если компилятор говорит, каким будет поведение, то, если вы используете этот компилятор (и он сохраняет это поведение), то вы можете положиться на это поведение.

Есть ли вероятность, что это может привести к блокировке потока (взаимоблокировке)?

Да. UB может привести к чему угодно. Например, если функция разблокировки безусловно уменьшает число блокировок, она может опуститься до минимума, сохраняя мьютекс заблокированным навсегда.

Неопределенное поведение будет видно в pthread_mutex_unlock, где он разблокировал уже разблокированный поток? Или неопределенное поведение можно увидеть на любом из следующих вызовов pthread?

Вы спрашиваете, как определяется поведение. Это не определено. После этого может произойти все, что угодно, по крайней мере, так, как говорит стандарт POSIX pthreads. Если что-то еще не указано, что может произойти, это может быть что угодно, и вы официально не имеете права жаловаться.

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