2014-09-02 3 views
8

Visual Studio 2013의 std::mutex 구현이 너무 느립니다. 무거운 무게 뮤텍스를 사용하여 모든 프로세스와 미세한 프로세스 사이에서도 동기화가 이루어질 수 있습니다. 당신이 다른 프로세스와 대화하고 있지 않고 실제로 여분의 속도를 사용할 수 없다면 CRITICAL_SECTION은 Win32에서 스핀 록을 제공합니다.std :: condition_variable에서 사용할 C++ 11 뮤텍스 개념을 구현할 수 있습니까?

fast_recursive_mutex을 구현하려고 시도했지만 C++ 11 뮤텍스 개념을 준수하며 사양에 따라 모든 의무를 충족합니다. 모든 감각에서 프로세스간에 동기화를 수행하지 않는 한 std::mutex의 드롭 인 대체품입니다.

std::lock_guardstd::unique_lock과 잘 작동합니다. 그러나 std::condition_variable::wait(std::unique_lock<std::mutex>&)std::mutex의 하드 코딩 된 사용으로 인해 내 fast_recursive_mutex을 허용하지 않기 때문에 std::condition_variable과 함께 사용하려고 할 때 문제가 발생합니다.

그래서 제 질문은 다음과 같습니다

  1. 이유는 wait()std::mutex 아닌 다른 뮤텍스 유형을 인정하지 않는 이유는 무엇입니까?
  2. 내가 할 수 있는게 있나요? (condition_variable을 다시 구현하지 않은 경우).
+0

"왜 다른 유형을 인정하지 않는가?"라는 첫 번째 질문은 두 개의 다른 'condition_variable'클래스를 작성한 이유와 단순히 템플리트 화 된 뮤텍스 유형이있는 유형이 하나도없는 이유를 묻는 것입니다. – CashCow

답변

6

당신은 어떤 잠금 유형에 대한 std::condition_variable_any를 사용할 수 있습니다.

+0

첫 번째 질문에 대해 알고 계십니까? – anderas

+1

@anderas : http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable –

+2

내가 참조 및 인터넷 검색 때 ... 고마워! –

0

Visual Studio 2012/2013의 std::mutex 구현이 이미 중요한 섹션을 사용하고 있다고 생각합니다. 그냥 확인하십시오 VSDIR\VC\crt\thr\mutex.c

또한 std::mutex::native_handle() 방법을 사용하여 실험적으로 확인하고 CRITICAL_SECTION으로 돌려 보내실 수 있습니다.

+1

많은 사람들이 이것을 측정했습니다. 예 : http://stackoverflow.com/a/18092273/2498188 및 http://stackoverflow.com/a/24470878/2498188. 내 자신의 측정 값은 이들과 일치합니다 .. –

+0

내 포인트는 VS가 말 그대로 무거운 무게의 ipc 가능 뮤텍스를 사용하지는 않지만 VC = crt \ src에서'critical_section :: _ Acquire_lock()'을 확인하는 Concurrency :: critical_section'을 사용합니다. \ rtlocks.cpp)가'CRITICAL_SECTION'보다 두 배 느립니다. – kozmo

관련 문제