2014-11-07 4 views
2

두 개의 스레드가있는 프로세스가 있다고 가정 해 보겠습니다. 하나의 쓰레드는 공유 리소스에 대한 작업을 수행하고 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 포크를 가정 해 봅시다. 아마도 자식 프로세스는 부모 프로세스와 동일한 잠금 상태입니다.

어떻게됩니까? 상위 프로세스와 경쟁 조건이 있습니까?

+1

더 흥미로운 질문은 공유 리소스가 기록되는 중에 포크가 발생하면 어떻게 될지입니다. 시스템이 똑똑해서 스레드 중 하나가 뮤텍스를 다시 획득하기 위해 대기 할 때도 해당 스레드가 뮤텍스를 획득 할 때 공유 리소스를 시작했을 때와 다른 시각을 가질 수 있습니다 (다른 스레드가 완료했기 때문에). 그것은 갈래의 중간에 있었다.) 나는 포크와 읽기/쓰기 잠금을 동기화하는 것을 강력하게 제안 할 것이다. 모든 스레드는 읽기 잠금을 유지하여 포크를 방지하고 쓰기 잠금을 포크로 가져올 수 있습니다. – cdhowie

+1

하나 이상의 스레드가있을 때 포크를 사용하지 말 것을 강력히 권합니다. 필요한 경우 각 하위 프로세스에서 shmem을여십시오. 또는 공유 프로세스를 처음부터 분기 프로세스와 분리하십시오. 플랫폼 의존적/불특정 행동에 의존하지 않는 것. – sehe

답변

2

interprocess_sharable_mutex을 보유하고 있거나 뮤텍스에 의해 보호되고 있던 메모리를 액세스하지 않는 한 포크를하지 않는 한 괜찮습니다.

뮤텍스가 공유 메모리에 존재합니다. 즉, 사용자가 분기해도 mutex 상태가 복제되지 않습니다. 그것은 한 장소에 존재하며 두 프로세스 모두가 접근 할 수 있습니다.

포크는 자식의 분기 스레드 만 유지하기 때문에 부모의 다른 스레드 만 뮤텍스의 소유권을 가지고 있다고 생각하므로 아무런 문제가 없습니다. 분기 후에 mutex를 얻으려고해도 여전히 괜찮습니다. 그것은 부모가 그것을 놓을 때까지 막을 것입니다.