2011-02-28 4 views
10

크로스 플랫폼 IPC에 대한 나의 기본 선택은 향상 될 것이지만 나는 그것에 대해 물었을 때 두 가지 다른 포럼에서 비판하는 것을 보았다. 아마도 이것은 우연의 일치 였을 것이므로 IPC를 높이고 일반적으로 크로스 플랫폼 C++ IPC 라이브러리를 선택하는 것에 대한 생각은 무엇입니까?부스트 IPC가 좋습니까?

Windows 용 우리는 참조 용으로 VC++ 2008을 사용하고 있습니다.

편집 : 여기에 내가 만들어 본 적이 주석의 예입니다 (모두 지금을 찾을 수 없습니다) :

향상을 위해, 그것은 쓰레기입니다. 적어도 창. 뮤텍스는 WinAPI를 사용하지 않고 대신 자체적으로 파일 기반 구현 (WinAPI = Kernel-Objects)을 만듭니다. 프로그램 이 충돌하면 파일이 삭제되지 않습니다. 다음 번에 프로그램이 시작될 때 기존 파일 때문에 뮤텍스를 만들 수 없습니다.

+1

누락 된 기능은 무엇입니까? 이것에 대한 대답이 없다면, 나는 왜 당신이 당신의 요구 사항을 공유하지 않을 수있는 다른 사람들로부터 "비판"에 대해 걱정할 필요가 있는지 알지 못합니다 ... – Nim

+1

그들은 정확히 무엇을 비판하고 있습니까? 링크를 제공 할 수 있습니까? 그것이 그렇듯이 질문은 너무 모호합니다. –

+2

그것은 비판 된 기능이 아니라 구현입니다. 나는 질문이 막연하다는 것을 알지 못한다. Boost의 구현에 문제가 있다면 공유하고, 더 나은 라이브러리가 있다면 그것을 나열한다. –

답변

7

내 제한된 Boost.Interprocess 경험으로 큰 문제는 없었지만 성능에 대해서는 언급 할 수 없습니다. 프로그램의 폴더 외부에서 생성 된 파일을 사용하여 실제로 작업을 수행하는 것은 사실이지만 모든 성능 문제를 무효화하는 메모리 매핑이 모두 이루어져야합니다. 어떤 경우 든, IPC를 사용하고있을 때는 항상 약간의 성능 오버 헤드가 예상됩니다.

당신이 강조한 비판에 관해서는, 이전 프로세스에서 주위에 놓여 있던 명명 된 뮤텍스 또는 다른 명명 된 리소스를 제거 할 수 있습니다 (정적 remove(const char*) 기능 참조). 공정에 따라 애플리케이션에 따라 Windows API를 사용할 때 처리해야하는 것이 아니라 올바르게 사용하는 것이 까다로울 수 있습니다. 반면에 Windows API는 이식 가능하지 않습니다. 내 생각에 다른 플랫폼에서 라이브러리의 인터페이스와 동작을 일관되게 유지하기 위해 파일을 사용합니다 (더 나은 대안이있는 경우 라 할지라도).

어쨌든 명명 된 뮤텍스는 라이브러리가 제공하는 것의 일부일뿐입니다. 보다 유용한 기능 중 하나는 own memory managers for the shared memory regionSTL allocators을 포함한다는 것입니다. 개인적으로 원시 메모리를 제공하는 상위 레벨 구조로 작업하는 것이 더 즐겁습니다.


업데이트 : 좀 더 부스트 설명서의 파고 않았다 나는 여러 가지 흥미로운 TID 비트 건너 온 :

This page이 구현에 대한 좀 더 세부 사항 및 라이브러리의 성능을 제공하지만, 구현의 이론적 근거를 포함하지 않는다.

This link은 Windows 뮤텍스 구현이 일부 작업 (버전 1.46)을 사용할 수 있다고 분명히 명시합니다. boost\interprocess\sync 폴더에서 조금 더 자세히 살펴보면 posixemulation이라는 폴더가 두 개 더 있음을 알 수 있습니다. 이 두 가지 모두 동기화 프리미티브의 구현 세부 정보를 포함합니다.interprocess_mutex::lock에 대한 POSIX 구현은 당신이 기대하는 것입니다하지만 에뮬레이션 구현은 아주 기본적인이다 : 그것의 모양에 의해 그래서

// Taken from Boost 1.40. 
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); 
} 

, 그들은에서 POSIX 지원을위한 목표 및 메모리 매핑 사용하는 에뮬레이션 레이어로 다른 모든 blobbed 파일. 왜 그들이 특수화 된 Windows 구현을 제공하지 않는지 알고 싶다면 부스트 메일 링리스트 (나는 문서에서 아무것도 찾을 수 없음)를 묻는 것이 좋습니다.

+0

흠, 여러 가지 OS가 다르게 작동하기 때문에 부스트 등의 라이브러리가 필요합니다. Windows와 같은보다 효율적인 메커니즘이 리눅스에 있다고 생각했습니다. 크로스 플랫폼 라이브러리가 필요합니다. 플랫폼 별 효율적인 메커니즘을 사용하고 일관된 추상화를 제공합니다. –

+0

@ John 그 문제는 라이브러리의 크기와 복잡성을 높이는 동시에 이식성을 줄이는 것입니다. 지원하려는 모든 OS에 대해 라이브러리의 상당 부분을 다시 작성해야하는 경우, 아마 잘못했을 수 있습니다. 당신을 생각해보십시오, 이것은 순수한 추측입니다. Boost 메일 링리스트에서 언제든지 질문 해 볼 수 있습니다. –

+1

크로스 플랫폼 라이브러리의 요점은 다양한 플랫폼에서 공통적 인 추상화를 통해 서로 다른 하위 수준의 항목을 래핑한다는 점입니다. 저수준의 것들이 다르다는 사실은 라이브러리의 전체적인 포인트입니다 ... 예를 들어, 크로스 플랫폼 GUI 라이브러리를보십시오. –

1

이것은 귀하의 질문에 대한 직접적인 대답은 아니지만 대안 : dev 환경에서 선택하면 Qt와 the D-bus implementation in Qt을 고려할 수 있습니다.

+0

아니, 전체 프레임 워크를 사용하기 위해 전체 응용 프로그램을 다시 작성할 수는 없습니다. :). –