Обеспечивает ли API-интерфейс pthread синхронизацию в многопроцессорной среде?
Я только начал изучать API-интерфейс pthread. Я использую разные книги и веб-сайты и, судя по тому, что они все сообщают, функции синхронизации pthread (например, с мьютексами) работают как для однопроцессорной, так и для многопроцессорной среды. Но ни один из этих источников прямо не заявил об этом, поэтому я хотел знать, так ли это на самом деле (конечно, я верю в это, я просто хотел быть уверен на 100%).
Таким образом, если два потока, работающие на разных процессорах, называются блокировкой (например, pthread_mutex_lock()
) в одном и том же мьютексе одновременно, будет ли выполнение этой подпрограммы выполняться последовательно, а не параллельно? И после того, как первая блокировка закончена, и вызывающий поток имеет частный доступ к критическому разделу, вызывает ли блокировка, выполняемая другим потоком на другом процессоре, последний поток, чтобы приостановить?
1 ответ
Да, это так. POSIX API описывается в терминах требований к реализациям - например, pthread_mutex_lock()
который возвращает ноль или EOWNERDEAD
должен вернуться с мьютексом заблокированным и принадлежащим вызывающему потоку. Для многопроцессорных сред нет исключений, поэтому соответствующие реализации в многопроцессорных средах должны продолжать обеспечивать его работу.
Итак, если два потока, работающие на разных процессорах, называются блокировкой (например,
pthread_mutex_lock()
) в одном и том же мьютексе одновременно, будет ли выполнение этой подпрограммы выполняться последовательно, а не параллельно?
Не указано как pthread_mutex_lock()
работает ниже, но с точки зрения приложения вы знаете, что если он не возвращает ошибку, ваш поток получил блокировку.
И после того, как первая блокировка закончена, и вызывающий поток имеет частный доступ к критическому разделу, вызывает ли блокировка, выполняемая другим потоком на другом процессоре, последний поток, чтобы приостановить?
Да - спецификация для pthread_mutex_lock()
говорит:
Если мьютекс уже заблокирован другим потоком, вызывающий поток должен блокироваться, пока мьютекс не станет доступным.