2016-10-30 10 views
0

Я только начал изучать API-интерфейс pthread. Я использую разные книги и веб-сайты, и, судя по тому, что они все сообщают, функции синхронизации pthread (например, связанные с мьютексами) работают как для однопроцессорных, так и для многопроцессорных сред. Но ни один из этих источников прямо не заявил об этом, поэтому я хотел знать, действительно ли это так (конечно, я так считаю, я просто хотел быть на 100% уверенным).Предоставляет ли pthread API синхронизацию в многопроцессорной среде?

Итак, если два потока, выполняющиеся на разных процессорах, называемых блокировкой (например, pthread_mutex_lock()) на одном и том же мьютексе одновременно, выполнялось бы выполнение этой процедуры последовательно, а не параллельно? И после того, как первая блокировка завершена, и поток, вызывающий его, имеет частный доступ к критическому разделу, делает ли блокировка, выполняемую другим потоком другого ЦП, приостанавливать последний поток?

+3

Только представьте себе на одну секунду последствия, если ответ на ваш вопрос был отрицательным. –

+0

Да. Было бы не очень полезно, если бы это не так, не так ли. –

ответ

1

Да, это так. API POSIX описывается с точки зрения требований к реализациям - например, pthread_mutex_lock(), который возвращает ноль или EOWNERDEAD должен возвращаться с блокировкой мьютекса и принадлежащим вызывающему потоку. Для многопроцессорных сред нет исключений, поэтому соответствующие реализации в многопроцессорных средах должны продолжать работать.

Таким образом, если два потока, работающие на разных процессорах называется замок (например pthread_mutex_lock()) на одной и той же взаимной блокировки в то же время, бы выполнение этой процедуры выполняется последовательно, а не параллельно ?

Это не указано, как pthread_mutex_lock() работает внизу, но с точки зрения приложений вы знаете, что если он не возвращает ошибку, ваш поток приобрел замок.

И после первого замка закончился, и поток вызов имеет частный доступ к критической секции, делает замок выполнен в другого потока на другой процессор вызвать последний поток приостановить?

Да - спецификация pthread_mutex_lock() говорит:

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

 Смежные вопросы

  • Нет связанных вопросов^_^