공유 POSIX 뮤텍스가 이미 초기화되었다고 가정합니다 (PTHREAD_PROCESS_SHARED 사용).잠긴 공유 POSIX 뮤텍스를 다시 매핑 할 수 있습니까?
그런 다음, 다음과 같은 절차를 고려해이 같이 작동합니다
typedef struct {
pthread_mutex_t mutex;
// ...
} Shared;
Shared *shared = (Shared *)mmap(...); // MAP
pthread_mutex_lock(&shared->mutex); // LOCK
// REMAP
munmap(shared, ...);
shared = (Shared *)mmap(...);
pthread_mutex_unlock(&shared->mutex); // UNLOCK
합니까 POSIX 보증을 "순진"목적?
필자가 볼 수있는 한, 관련 맨 페이지에는 그러한 시나리오가 언급되어 있지 않습니다.
또한, 다음과 같은 리눅스 특정 대안에 대해 무엇을 :
Shared *shared = (Shared *)mmap(...); // MAP
pthread_mutex_lock(&shared->mutex); // LOCK
shared = (Shared *)mremap(shared, ...); // MREMAP_MAYMOVE
pthread_mutex_unlock(&shared->mutex); // UNLOCK
내가 상상할 수있는 예를 들어, 프로세스 내 어딘가에 잠겨 뮤텍스에 대한 포인터를 저장하는의 pthreads 구현 . 뮤텍스가 강건 (PTHREAD_MUTEX_ROBUST)으로 설정되면 뮤텍스가 잠긴 동안 프로세스가 종료되면 구현시 뮤텍스를 '버려진'것으로 표시 할 수 있습니다.
나는 이러한 방식은 실제로 작동할지 여부가 POSIX, 또는 얼마나 뮤텍스 견고 실제로 모든 플랫폼에서 구현하여 허용 여부를, 아무 생각이 없지만, 경우 다음 행과 함께 구현 것 작업 및 것 POSIX에 따라 유효하다면 위의 매핑 시나리오는 정의되지 않은 동작을합니다.
왜 제대로 작동하지 않을지 모르겠다. – Celada
@Celada : 필자는 POSIX가 구현에 어떤 제약 조건을 두 었는지에 따라 어떻게 실패 할지를 알 수있는 절을 추가했습니다. –
견고한 뮤텍스에 대한 좋은 점. 나는 네가 네 자신의 질문에 대답했다고 생각한다! (링크 된 목록에서 glibc에 의해 유지되는) 방법 때문에 (http://www.kernel.org/doc/Documentation/robust-futexes.txt), 나는 그들의 메모리 주소가 갑자기 그들이 개최되는 동안 변경하십시오. – Celada