programing

shared_mutex 향상에 해당하는 C ++ 11

procenter 2021. 1. 14. 23:19
반응형

shared_mutex 향상에 해당하는 C ++ 11


에 대한 동등한 C ++ (11)이 있습니까 boost::shared_mutex. 또는 C ++ 11에서 다중 판독기 / 단일 작성기 상황을 처리하는 또 다른 솔루션은 무엇입니까?


시도했지만 shared_mutexC ++ 11에 들어 가지 못했습니다 . 향후 표준으로 제안되었습니다. 제안은 여기에 있습니다 .

편집 : 수정 된 버전 (N3659) C ++ 14에 적용되었습니다.

다음은 구현입니다.

http://howardhinnant.github.io/shared_mutex

http://howardhinnant.github.io/shared_mutex.cpp


간단합니다. 하나도 없습니다. 판독기-작성기 잠금 의 표준 C ++ 구현은 없습니다 .

그러나 여기에는 몇 가지 옵션이 있습니다.

  1. 독자-작가 잠금을 만들기 위해 자신의 장치에 남겨집니다.
  2. 언급 했듯이 Win32 , POSIX 또는 Boost 와 같은 플랫폼 별 구현을 사용하십시오 .
  3. 전혀 사용하지 마십시오- 이미 C ++ 11에 있는 뮤텍스사용하십시오 .

함께가는 # 1 과 자신을 구현하는 무서운 사업이며, 당신이 바로 그것을 얻을하지 않는 경우는 경쟁 조건에 코드를 수수께끼하는 것이 가능하다. 작업을 좀 더 쉽게 만들 수 있는 참조 구현 이 있습니다.

플랫폼에 독립적 인 코드를 원하거나 리더-라이터 잠금과 같은 간단한 작업을 위해 코드에 추가 라이브러리를 포함하지 않으려면 창 밖으로 # 2를 버릴 수 있습니다 .

그리고 # 3 에는 대부분의 사람들이 인식하지 못하는 몇 가지주의 사항이 있습니다. 독자-작성기 잠금을 사용하는 것은 종종 성능이 떨어지고 간단한 뮤텍스를 사용하는 동등한 구현보다 코드를 이해하기 더 어렵습니다. 이는 독자-작성기 잠금 구현의 배후에서 진행해야하는 추가 부기 때문입니다.


저는 여러분의 옵션만을 제시 할 수 있습니다. 실제로 각각의 비용과 이점을 평가하고 가장 효과적인 것을 선택하는 것은 여러분에게 달려 있습니다.


편집 : C ++ 17은 이제 shared_mutex여러 명의 동시 판독기를 갖는 이점이 shared_mutex자체 의 성능 비용을 능가하는 상황 을위한 유형이 있습니다.


아니요, boost::shared_mutexC ++ 11 에는에 해당하는 항목이 없습니다 .

하지만 읽기 / 쓰기 잠금은 C ++ 14 이상에서 지원됩니다.

차이점은 std::shared_timed_mutex추가적인 타이밍 작업 추가 한다는 것입니다. 그것은 구현 SharedTimedMutex 개념 간단한의 확장, TimedMutex 개념 에 의해 구현을 std::shared_mutex.


읽기 / 쓰기 뮤텍스에 대한 잠금을 획득하는 것은 일반 .NET을 획득하는 것보다 비용이 더 많이 든다는 것을 명심하십시오 std::mutex. 결과적으로 읽기 / 쓰기 뮤텍스는 자주 읽기 작업을 자주 수행하는 경우 성능을 향상시키지 않습니다. 읽기 작업이 빈번하고 비용이 많이 드는 시나리오에 더 적합합니다. Anthony Williams의 게시물 에서 인용하려면 :

shared_mutex를 잠그는 비용은 읽기 스레드의 경우에도 일반 std :: mutex를 잠그는 비용보다 높습니다. 이것은 기능의 필수 부분입니다. --- 뮤텍스보다 shared_mutex의 가능한 상태가 더 많으며 코드는이를 올바르게 처리해야합니다. 이 비용은 객체의 크기 (구현과 내 POSIX 구현 모두에서 일반 뮤텍스와 조건 변수를 모두 포함 함)와 잠금 및 잠금 해제 작업의 성능에서 발생합니다.

또한 shared_mutex는 경합 지점이므로 확장 가능하지 않습니다. shared_mutex를 잠그면 읽기 잠금의 경우에도 뮤텍스의 상태가 반드시 수정됩니다. 결과적으로 shared_mutex 상태를 유지하는 캐시 라인은 잠금 또는 잠금 해제 작업을 수행하는 프로세서로 전송되어야합니다.

짧은 읽기 작업을 자주 수행하는 스레드가 많으면 다중 프로세서 시스템에서 많은 캐시 핑퐁이 발생하여 시스템 성능에 상당한 영향을 미칠 수 있습니다. 이 경우 독자는 어쨌든 본질적으로 직렬화되므로 일반 뮤텍스를 사용하는 단순한 디자인을 채택 할 수도 있습니다.

읽기가 빈번하지 않으면 경합이 없으므로 동시 판독기에 대해 걱정할 필요가 없으며 어쨌든 해당 시나리오에 대해 일반 뮤텍스로 충분합니다.

읽기 작업에 시간이 많이 소요되는 경우이 경합의 결과는 읽기 잠금을 유지하는 동안 소요 된 시간에 비해 크기가 작기 때문에 눈에 잘 띄지 않습니다. 그러나 자물쇠를 잡고 시간이 많이 걸리는 작업을 수행하는 것은 디자인 냄새입니다.

대부분의 경우 shared_mutex에 대한 더 나은 대안이 있다고 생각합니다. 이는 평범한 뮤텍스, shared_ptr의 원자 적 지원, 신중하게 구성된 동시 컨테이너의 사용 또는 컨텍스트에 따라 다른 것일 수 있습니다.

참조 URL : https://stackoverflow.com/questions/14306797/c11-equivalent-to-boost-shared-mutex

반응형