@pixik

Как работает std::mutex на низком уровне?

Доброго времени!
Скажите пожалуйста, где почитать, как работает mutex и ему подобные примитивы синхронизации на низком уровне? По сути все понятно, если поток выполняет:
mutex l;
f(){
  ...
  l.lock();
  ... 
  l.unlock();
}

то другой поток при встрече с секцией, где происходит блокировка на строке l.lock(), блокируется пока первый поток не разлочит мутекс. У меня во многих программах нужно использовать многпоточность (std::thread), и различные блокировки. Работают (с точки зрения многопоточного взаимодействия) не плохо. Но я думаю, что они могли бы быть более эффективны, если бы я понимал как это работает на более низком уровне. (или я не прав?)
Интересен не только случай с mutex, но и вообще примитивы блокировки и работа с потоками. Есть ли интересная литература или туториалы на этот счет?

upd: интересует в случае unix like систем.

Всем спасибо!
  • Вопрос задан
  • 3781 просмотр
Решения вопроса 2
@MiiNiPaa
На самом низком уровне синхронизация делается при помощи атомарных инструкций процессора. Скажем, модно использовать атомарную операцию обмена, чтобы записать в ячейку 1. Если предыдущее значение было 0, то мы теперь владеем каким-либо ресурсом, если там 1, то его уже занял кто-то другой и нужно попробовать снова позже.

На более высоком уровне обычно в дело вступает ОС. Так как процессы изолированы друг от друга и не могут взаимодействовать напрямую, необходимо посредничество операционной системы. Как это сделано, зависит от системы. Выберите конкретную и гуглите:
Вопрос на StackOverdlow
linux.die.net/man/2/futex
To reiterate, bare futexes are not intended as an easy-to-use abstraction for end-users. Implementors are expected to be assembly literate and to have read the sources of the futex user-space library referenced below.

Исходники pthread (Который используется для реализации std::tread, std::mutex, etc)

EDIT: И не используйте lock/unlock напрямую. Оберните их в lock_guard.
Ответ написан
Olej
@Olej
инженер, программист, преподаватель
Параллелизм, конкурентность, многопроцессорность в...
QNX/UNIX: анатомия параллелизма

Как работает std::mutex на низком уровне?

На низком уровне работает как обёртка вокруг pthread_mutex_t.
Обратите внимание, есть большая разница стандарта pthread_mutex_t и его реализации в Linux (не в лучшую сторону).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
Для винды есть "родной" объект mutex, пригоден для синхронизации между потоками. API для работы с ним: CreateMutex, ReleaseMutex, CloseHandle. Есть еще "critical section", она непригодна для синхронизации между процессами. API: InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection. Примеры, подробная документация - в MSDN.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы