2009-07-22 2 views
3

부스트 소스 코드 내에서 조사를 수행 할 수 있으며 답변이있는 사람이 없다면 내 호기심에 대답 할 수 있습니다.boost :: interprocess_mutex와 Win32 네이티브 뮤텍스의 성능은 어떻습니까?

누군가가 이미이 비교를 수행하고 정식으로 대답 할 수 있기 때문에 나는 묻습니다.

프로세스간에 공유 메모리 매핑 된 파일을 만들고 InterlockedIncrement()을 사용하여 구성하면 프로세스 간 동기화를 위해 Win32 뮤텍스보다 훨씬 더 뛰어난 CRITICAL_SECTION과 비슷한 Usermode 뮤텍스를 만들 수 있습니다.

내 생각에 이런 식으로 구현 된 boost::interprocess_mutex의 Win32 구현은 아마도 기본 API 제공보다 훨씬 빠를 것으로 예상됩니다.

그러나 나는 단지 가정을 가지고 있습니다. 필드 테스트를 통해 boost::interprocess_mutex의 성능이 프로세스 간 동기화를위한 것인지 또는 구현을 자세히 조사했는지는 알 수 없습니다.

누구나 그것을 사용하거나 상대적인 성능을 프로파일 링 한 경험이 있거나 공유 메모리를 사용하는 프로세스에서 InterlockedIncrement()를 사용하는 데 대한 안전성에 대해 의견을 말할 수 있습니까?

+0

질문을 이해하는 경우 뮤텍스보다 더 중요한 섹션을 묻는 것처럼 보입니다 (대답은 '예'입니다). 오해하는 경우 귀하의 질문에 대해 다시 말하십시오. –

+2

크리티컬 섹션은 두 프로세스 간의 공유 메모리에서 생성 될 수 없으므로 프로세스 간 동기화를위한 후보 메커니즘이 아닙니다. –

+0

@Neil - 게시판에 의견을 남겼습니다. –

답변

1

프로세스간에 공유 메모리 맵 파일을 생성하고 InterlockedIncrement (건설)를 통해 하나 간 용은 Win32 뮤텍스보다 상당히 더 확대됨 일 것 CRITICAL_SECTION 유사한 크게 유저 모드 뮤텍스를 만들 수있는 것으로 보인다 동기화.

CRITICAL_SECTION 내부적으로 경합이있을 때 동기화 프리미티브를 사용할 수 있습니다. 이벤트, 세마포어 또는 뮤텍스인지 잊어 버립니다.

Interlocked 함수를 메모리에 "안전하게"사용할 수 있기 때문에 프로세스 간 동기화에 사용할 수없는 이유는 없습니다. 그 외에는 정말 미쳐서 스레드 나 실제 동기화를 사용해야합니다. 원어.

But officially, you can.

+0

이것은 내가 믿기로, Windows에서 프로세스 간 동기화를 위해 인터 로크 된 증가분을 사용하는 것에 관한 많은 지식을 찾을 수 없습니다.그것을하는 것을 암시한다. 공유 메모리는 스레딩 프레임 워크에 대한 보급 및 개발 전문 지식으로 인해 Win32 플랫폼에서 자주 사용되는 기술이 아니기 때문에 다소 모호한 질문 일 수 있습니다. –

+0

http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx Interlocked API에서 첫 번째 단락의 마지막 문장을 아래로 내리면 공유 메모리에 사용할 수 있다고 표시됩니다. 프로세스 간. – MSN

+0

"변수가 공유 메모리에 있으면 다른 프로세스의 스레드가이 함수를 사용할 수 있습니다." 잘 알았어, 고마워. :) 구현에이 기능을 사용하는 사람들이 있는지 궁금합니다. –

3

부스트 1.39.0에서는 pthreads 만 지원합니다. 다른 모든 플랫폼에서는 중간에 yield call이있는 busy-loop가됩니다 (기본적으로 사용자가 설명하는 것과 동일한 시스템). boost/interprocess/sync/emulation/interprocess_mutex.hpp를 참조하십시오. 예를 들어, 다음은 잠금 장치의 구현은()이다 :

inline void interprocess_mutex::lock(void) 
{ 
    do{ 
     boost::uint32_t prev_s = detail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0); 

     if (m_s == 1 && prev_s == 0){ 
      break; 
     } 
     // relinquish current timeslice 
     detail::thread_yield(); 
    }while (true); 
} 

이것이 의미하는 것은 윈도우의 주장 부스트 :: 간 :: 뮤텍스가 매우 비싼 것으로합니다 - 경쟁이 없었던 경우는 거의 무료입니다 있지만. 이벤트 객체 나 이와 유사한 객체를 추가하면 잠재적으로 개선 될 수 있지만 boost :: interprocess의 API에는 적합하지 않습니다. 뮤텍스에 액세스하는 데 필요한 프로세스 별 핸들을 배치 할 곳이 없기 때문입니다.

+1

로컬 저장소 처리는 malloc() 또는 new :)입니다. – bdonlan

관련 문제