История изменений
Исправление hatred, (текущая версия) :
могу ошибаться, давно смотрел, но сейчас на Linux std::mutex он поверх pthread_mutex_t, а тот построен поверх вызова futex и спин лока. Очередей там нет. Так что порядок пробуждения будет зависеть больше от того, в каком порядке планировщик будет давать работу твоим потокам, которые заблокировались на этом мутексе, а после освобождения - кто первый проснулся, того и тапки. Не стоит надеяться на порядок прихода блокировку.
Собственно вот главное из futex.2
FUTEX_WAKE (since Linux 2.6.0)
This operation wakes at most val of the waiters that are
waiting (e.g., inside FUTEX_WAIT) on the futex word at the
address uaddr. Most commonly, val is specified as either
1 (wake up a single waiter) or INT_MAX (wake up all
waiters). No guarantee is provided about which waiters
are awoken (e.g., a waiter with a higher scheduling
priority is not guaranteed to be awoken in preference to a
waiter with a lower priority).
Конкретно:
No guarantee is provided about which waiters are awoken (e.g., a waiter with a higher scheduling priority is not guaranteed to be awoken in preference to a waiter with a lower priority).
Исправление hatred, :
могу ошибаться, давно смотрел, но сейчас на Linux std::mutex он поверх pthread_mutex_t, а тот построен поверх вызова futex и спин лока. Очередей там нет. Так что порядок пробуждения будет зависеть больше от того, в каком порядке планировщик будет давать работу твоим потокам, которые заблокировались на этом мутексе, а после освобождения - кто первый проснулся, того и тапки. Не стоит надеяться на порядок прихода блокировку.
Собственно вот главное из futex.2
FUTEX_WAKE (since Linux 2.6.0)
This operation wakes at most val of the waiters that are
waiting (e.g., inside FUTEX_WAIT) on the futex word at the
address uaddr. Most commonly, val is specified as either
1 (wake up a single waiter) or INT_MAX (wake up all
waiters). No guarantee is provided about which waiters
are awoken (e.g., a waiter with a higher scheduling
priority is not guaranteed to be awoken in preference to a
waiter with a lower priority).
Конкретно:
No guarantee is provided about which waiters are awoken (e.g., a waiter with a higher scheduling priority is not guaranteed to be awoken in preference to a waiter with a lower priority).
Исправление hatred, :
могу ошибаться, давно смотрел, но сейчас на Linux std::mutex он поверх pthread_mutex_t, а тот построен поверх вызова futex и спин лока. Очередей там нет. Так что порядок пробуждения будет зависеть больше от того, в каком порядке планировщик будет давать работу твоим потокам, которые заблокировались на этом мутексе, а после освобождения - кто первый проснулся, того и тапки. Не стоит надеяться на порядок прихода блокировку.
Исходная версия hatred, :
могу ошибаться, давно смотрел, но сейчас на Linux std::mutex он поверх pthread_mutex_t, а тот построен поверх вызова futex. Очередей там нет. Так что порядок пробуждения будет зависеть больше от того, в каком порядке планировщик будет давать работу твоим потокам, которые заблокировались на этом мутексе, а после освобождения - кто первый проснулся, того и тапки. Не стоит надеяться на порядок прихода блокировку.