Обеспечивает ли 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() говорит:

Если мьютекс уже заблокирован другим потоком, вызывающий поток должен блокироваться, пока мьютекс не станет доступным.

Другие вопросы по тегам