공유 메모리를 사용하는 두 프로세스간에 cv :: Mat 객체를 교환하기 위해 런타임 크기 매개 변수로 boost spsc_queue를 구성하는 방법은 무엇입니까?

Nov 18 2020

하나의 프로세스가 cv :: Mat 객체를 큐 버퍼에 공급하는 생성 된 소비자 시나리오를 구현하려고합니다 . 그리고 소비자는 그것들을 소비합니다. cv :: Mat 에는 사용자 정의 메모리 관리를 위해 구현할 수 있는 설정 가능한 할당자가 있지만 제대로 작동하지 못했습니다. 소비자 측면에서 튀어 나오면 세그 폴트가 발생했습니다. 내가 가진 가장 가까운 것은 cv :: Mat이 직렬화되고 역 직렬화되는 이 구현 입니다. 이 구현의 또 다른 단점은 컴파일 중에 버퍼 크기가 정의된다는 것입니다. 따라서 질문을 반복하기 위해 공유 메모리에서 cv :: Mat lockfree 큐를 효율적으로 구현하는 방법.

관련 질문 :

  • 공유 메모리에서 런타임 크기 매개 변수를 사용하여 런타임 부스트 spsc_queue를 구성 할 수 없음
  • 공유 메모리 IPC 동기화 (잠금 없음)
  • 소비자 프로세스에서 공유 메모리 및 동기화 된 대기열 문제 / 충돌을 강화합니다.

답변

sehe Nov 18 2020 at 20:24

에 대한 "설정 가능한"할당자는 cv::MatBoost Interprocess 할당자가 아닙니다.

인터페이스 를 랩핑 하는 cv::Matallocator인터페이스 를 구현 하는 것도 "어려울"것 같습니다 .

이것은 더 멋진 할당자가 CUDA 지원을위한 것이기 때문일 수 있지만 여기에서 약간 추측하고 있습니다.

따라서 직렬화를 강력히 제안합니다. 거대 행렬을 다루지 않는 한 괜찮습니다. 예를 참조하십시오

  • 이상한 결과를주는 cv :: Mat의 직렬화

물론 공유 메모리로 직렬화 할 수 있습니다. https://www.boost.org/doc/libs/1_37_0/doc/html/interprocess/streams.html 또는 https://www.boost.org/doc/libs/1_74_0/libs/iostreams/doc/quick_reference.html#devices

이제 큰 행렬이 필요한 경우 (그리고 어쨌든 OpenCV 여야 함) 기존 CV 할당자를 사용 하여 공유 메모리에 있는 이미 존재하는 연속 버퍼에서 할당하는 것을 고려 하십시오.

이것은 단순히 vector<int8_t, bip::allocator<int8_t> >or 처럼 간단 할 수 있으며 실제로 array<int8_t, 4096>공유 메모리 (관리 ( managed_shared_memory) 또는 관리되지 않음 ( bip::mapped_region에서 작동 bip::shared_memory_object) 내부에 생성됩니다.