Информация об изменениях

Сообщение Re[7]: внутренняя реализация std::mutex? от 17.05.2018 7:54

Изменено 17.05.2018 7:56 lpd

Re[7]: внутренняя реализация std::mutex?
Здравствуйте, barney, Вы писали:

B>Интересно, можно ли както синхронизировать потоки некоей атомарной операцией в usermode.


В том и отличие mutex от spinlock, что первый может освободить процессор и для этого переходит в режим ядра сисколлом, а спинлок просто в user-level крутит атомарную проверку флага, пока другой поток его не освободит. Если ожидание недолгое, то спинлок быстрее. Однако, если ожидание долгое, то лучше все-таки освободить процессор для других потоков.
Условная переменная работает тоже через sys_futex и переходит в режиме ядра для освобождения процессора, хотя ее тоже можно реализовать как спинлок на одних атомарных проверках в user-level.

B>Кстати, отдельный вопрос — не понятно, как потоки привязываются к ядрам? Привязываются ли.

B>Т.е в общем виде может ли заснувший поток — проснуться в другом ядре?

В общем случае да, поток может проснуться на любом ядре.
Но если нужно оптимизировать исполнением кода на конкретном ядре для эффективного использования кэша этого ядра, то можно привязать поток к ядру — для этого есть специальные системные вызовы.
Re[7]: внутренняя реализация std::mutex?
Здравствуйте, barney, Вы писали:

B>Интересно, можно ли както синхронизировать потоки некоей атомарной операцией в usermode.


В том и отличие mutex от spinlock, что первый может освободить процессор и для этого переходит в режим ядра сисколлом, а спинлок просто в user-level крутит атомарную проверку-и-захват флага, пока другой поток его не освободит. Если ожидание недолгое, то спинлок быстрее. Однако, если ожидание долгое, то лучше все-таки освободить процессор для других потоков.
Условная переменная работает тоже через sys_futex и переходит в режиме ядра для освобождения процессора, хотя ее тоже можно реализовать как спинлок на одних атомарных проверках в user-level.

B>Кстати, отдельный вопрос — не понятно, как потоки привязываются к ядрам? Привязываются ли.

B>Т.е в общем виде может ли заснувший поток — проснуться в другом ядре?

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