Обзор средств меж-поточной синхронизации.
От: pkl  
Дата: 14.03.13 20:40
Оценка:
Считаю себя близко знакомым с многопоточным программированием, но только из-за некоторых успехов в прикладной области, а не из-за понимания всех процессов, стоящих за потоками, примитивами синхронизации и т.п. Успехи были связаны сначала с применением pthread под linux при реализации сетевых серверов, затем связаны с применением boost::thread, boost::mutex, boost::condition_variable и т.п. в кросс-платформенных приложениях. Что стоит за вызовом pthread_lock() или блокировкой примитива из boost — не знаю, ассемблерный код не смотрел.

Понимаю, что синхронизация потоков реализуема на процессоре, если на нём есть (атомарная) машинная инструкция типа compare-and-change. Или ещё что-то? Догадываюсь, что высокоуровневая сущность типа семафор (который wait/post, [0,1,2,...)) достаточна, чтобы заменить собой мьютекс (который lock/unlock).

Интересно: (наивно и в лоб)

1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).
2. Как изнутри устроена pthreads — делает ли она вызовы в ядро linux? Какие основные вызовы WinAPI наших дней являются краеугольным камнем меж-поточной синхронизации и вообще нужны ли вызовы в ядро? Подозреваю, что нужны, ведь сон (в который надо уйти, если примитив синхронизации заблокирован)- это понятие шедулера ОС.
3. Какие ядерные вызовы в linux/windows на тему синхнонизации потоков существуют вообще, на каких местах рейтинга быстродействия они находятся? Какие устаревшие, какие новые? Какие для каких особых ситуаций?
4. Какие современные/хитрые/быстрые принципы синхронизации потоков сущетвуют, возможно без вызовов в ядро? Например рассчитанные на то, что ресурс заблокирован менее короткое время, чем требуется процессорного времени на гуляние внутри соответствующего вызова ядра?
5. К каким WinAPI / linux-kernel-API вызовам сводятся основные манипуляции с примитивами синхронизации из boost?
6. Работал с Qt4, но никогда не было желания воспринимать её как библиотеку для чего-то, отличного от интерфейса. Никогда не стану использовать её сетевые или многопоточные средства. Но если кто-нибудь черкнёт про особенности реализации средств синхронизации потоков в Qt4 — будет спасибо.
7. Чего такого хитрого желательно понимать или почитать при разработке многопоточных приложений для многопроцессорных машин с NUMA-блоками и прочими крутыми вещами?
8. Совсем нечёткий вопрос. Что почитать на тему снижения хаотичности переключения/переназначения (между процессорами) потоков на многопроцессорных машинах с целью минимизации порчи кешей разных ЦП? Вопрос должен быть связан с вопросом (7).

Спасибо.

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