두 개의 스레드가있는 프로세스가 있다고 가정 해 보겠습니다. 하나의 쓰레드는 공유 리소스에 대한 작업을 수행하고 boost :: interprocess :: mutex에 대해 범위가 지정된 잠금을 주기적으로 제거합니다. 다른 스레드는 임의의 시간에 fork/exec를 발생시킵니다.잠금을 획득하는 동안 프로세스가 포크를하면 부스트 프로세스 간 뮤텍스에 대한 잠금은 어떻게됩니까?
스레드
void takeLockDoWork() {
using namespace boost::interprocess;
managed_shared_memory segment(open_only, "xxx");
interprocess_sharable_mutex *mutex = segment.find<interprocess_sharable_mutex>("mymutex").first;
scoped_lock<interprocess_sharable_mutex> lock(*mutex);
// access or do work on a shared resource here
//lock automatically unlocks when scope is left.
}
1의이 scoped_lock가 꺼낸 직후 스레드 2 포크를 가정 해 봅시다. 아마도 자식 프로세스는 부모 프로세스와 동일한 잠금 상태입니다.
어떻게됩니까? 상위 프로세스와 경쟁 조건이 있습니까?
더 흥미로운 질문은 공유 리소스가 기록되는 중에 포크가 발생하면 어떻게 될지입니다. 시스템이 똑똑해서 스레드 중 하나가 뮤텍스를 다시 획득하기 위해 대기 할 때도 해당 스레드가 뮤텍스를 획득 할 때 공유 리소스를 시작했을 때와 다른 시각을 가질 수 있습니다 (다른 스레드가 완료했기 때문에). 그것은 갈래의 중간에 있었다.) 나는 포크와 읽기/쓰기 잠금을 동기화하는 것을 강력하게 제안 할 것이다. 모든 스레드는 읽기 잠금을 유지하여 포크를 방지하고 쓰기 잠금을 포크로 가져올 수 있습니다. – cdhowie
하나 이상의 스레드가있을 때 포크를 사용하지 말 것을 강력히 권합니다. 필요한 경우 각 하위 프로세스에서 shmem을여십시오. 또는 공유 프로세스를 처음부터 분기 프로세스와 분리하십시오. 플랫폼 의존적/불특정 행동에 의존하지 않는 것. – sehe