2016-06-30 10 views
0

각 스레드가 가상 메모리의 다른 영역에서 작동하는 경우 독립적으로 OpenMP 또는 Posix 스레드를 실행하여 mlock()을 안전하게 호출 할 수 있습니까? 그것은 시스템 전체 동기화 장벽을 만들거나 모든 스레드가 어떤 식 으로든 멈추게합니까?mlock() 및 스레딩

중복되는 경우 사과드립니다. 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()과 충돌 할 수도 있음). 경합이 실제로 유스 케이스의 문제인지 테스트 해 볼 필요가있다.