LINUX.ORG.RU

История изменений

Исправление 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. Очередей там нет. Так что порядок пробуждения будет зависеть больше от того, в каком порядке планировщик будет давать работу твоим потокам, которые заблокировались на этом мутексе, а после освобождения - кто первый проснулся, того и тапки. Не стоит надеяться на порядок прихода блокировку.