2016-06-30 3 views
0

Можно ли безопасно называть mlock() независимо от выполнения потоков OpenMP или Posix, учитывая, что каждый поток работает в другом регионе виртуальной памяти? Создает ли он системный барьер синхронизации или заставляет все потоки задерживаться каким-то образом?mlock() и Threading

Прошу прощения, если это дубликат; Я был удивлен, когда поисковые запросы Google «mlock openmp»/«mlock thread safety» не сразу ответили на ответ. Ближе всего я смог найти второй ответ Non-blocking mlock(), который, как представляется, указывает, что mlock() может быть вызван из отдельных потоков и не требует каких-либо ограничений синхронизации.

+0

Я не вижу 'mlock()' в списке небезопасных функций здесь: http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html, так что, по-видимому, это должно быть безопасно. – EOF

+0

Спасибо! Означает ли это, что mlock также не вызывает неявной синхронизации между потоками? –

+0

Нет, 'mlock()' не находится в списке асинхронных функций здесь http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html, поэтому он * может * сделать блокировку, если захочет , Такая блокировка будет блокировкой на уровне листа и, таким образом, не сделает функцию нить небезопасной, поскольку она не может участвовать в тупике. – EOF

ответ

1

mlock() можно безопасно звонить из нескольких потоков одновременно.

Что касается синхронизирует ли он против других вызовов mlock(), это вопрос качества жизни, реализации - в принципе любой системный вызов может синхронизировать с любой другой, нет никакого текста в стандарте POSIX, что запрещает его. На практике вы часто обнаружите, что системные вызовы, которые работают на карте памяти процесса, имеют тенденцию конкурировать друг с другом (поэтому mlock() может не просто конкурировать с другими вызовами mlock(), но также и с mmap()). Вам нужно будет проверить, не является ли конфликт на самом деле проблемой в вашем случае использования.