2011-10-26 3 views
2

공유 메모리에서 쓰기 작업을 기다리는 코드가 있습니다. 아무도 쓰지 않으면 대기합니다.boost scoped_lock에 의한 CPU 사용량이 너무 많음

Test* Foo::Get() 
    { 
     boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> lock (mutex) ; // mutex is boost::interprocess::interprocess_mutex 
     if (this->check == 0) 
      this->interprocessCondition.wait (lock) ; // interprocessCondition is boost::interprocess::interprocess_condition 

... 
    } 

샘플링을 수행했을 때 CPU 사용률이 90 %에 이르는 것으로 나타났습니다.

이 성능 문제를 해결할 수있는 사람이 있습니까? 첨부 된 이미지를 참조하십시오. 불행하게도, (분명히 OSX 포함) 많은 플랫폼에 대한 잠금을 위해 바쁜 대기 사용합니다

+0

다른 작업을 수행 중이거나 잠금 설정을 프로파일하고 있습니까? '다른 코드'는 어떻게 생겼을 까? –

+0

무언가에있는 Shared Memory에서 방금 읽는 중입니다. 완전한 실행 파일을 프로파일했습니다. – MacGeek

+2

그건별로 도움이되지 않습니다. 공유 메모리에서 int를 읽는 것보다 로크를 사용하는 것이 정상입니다. 자물쇠를 덜 세밀하게 만들어 해결할 수 있습니다. –

답변

6

boost::interprocess

Screen Shot

. 실제로 잠자기하는 플랫폼에 고유 한 잠금을 사용하려고합니다.

+0

다행히도, 당신이 성취하고자하는 바에 달려 있습니다. –

+0

sched_yield() 대신 sleep (1)을 추가했습니다. 요구? 지금은 아주 예쁜. 그것은 부작용이있을 것입니다, 떨어져 코드를 방해하지 않는 부스트 업데이트를 조심해야합니까? – MacGeek

+0

@MacGeek, 이것은 웨이크 업 대기 시간을 크게 늘립니다. – bdonlan

관련 문제