共有 POSIX ミューテックスがすでに初期化されていると仮定します (PTHREAD_PROCESS_SHARED を使用)。
次に、次の手順を検討します。
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は、これが「単純に」意図したとおりに機能することを保証していますか?
私が見る限り、関連するマニュアルページのどれもそのようなシナリオに言及していません.
また、次の Linux 固有の代替案はどうでしょうか。
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 に従って有効である場合、上記の再マッピング シナリオでは、未定義の動作が発生します。