2013-04-11 1 views
2

현재 내 코드에서 나는 중요한 부분이 뮤텍스보다 빠른 것을 읽을이 코드의 부스트 뮤텍스보다 빠릅니다.

boost::mutex Mymutex 

void methodA() 
{ 
    boost::mutex::scoped_lock lock(Mymutex); 
    ...... 
    ...... 
    ...... 
} 

이와 같은 섹션이? 그래서 나는 이것이 더 빠르다는 것을 알고 싶었습니다.

boost::recursive_mutex m_guard; 
void methodA() 
{ 
     // this section is not locked 
     { 
      boost::lock_guard<boost::recursive_mutex> lock(m_guard); 
     // this section is locked 
     } 
     //This section not locked 
}  

두 번째 방법이 더 빠릅니까? 내가 주로 뮤텍스를 사용하는 이유는 경쟁 조건을 방지하고 메서드에 대한 액세스를 잠그는 것입니다. 그래서 한 번에 한 스레드가 액세스합니다. 그보다 더 빠른 것이 있습니까? 내 다른 관심사는 성명서에 있었다

boost::lock_guard<boost::recursive_mutex> lock(m_guard); 

언제나 methodA()가 스택에 lock이 만들어 질 것이라고 생각되는 것 같습니다. 나는이 변수가 호출 될 때마다 스택에 생성되지 않도록 정적 변수로 lock을 선언하려고 생각했다.이 경우 어떻게 m_guard를 추가 할 수 있는가? 예를 들어

boost::recursive_mutex SomeClass::m_guard; //This is static 
boost::lock_guard<boost::recursive_mutex> SomeClass::lock //Suppose this is static 
void SomeClass::methodA() 
{ 

     { 
     //How do i make lock "lock" mguard 

     } 

}  

답변

3

는보다 빠른 있나요? busy-wait가 귀하의 경우 적절한

경우 spinlockboost::atomic_flag 위에 구현 사용하려고 할 수 있습니다. SO

: 그것은 잠금 호출 될 것이라고마다 methodA()을 보인다 When should one use a spinlock instead of mutex?

class spinlock 
{ 
    atomic_flag flag = ATOMIC_FLAG_INIT; 
public: 
    void lock() 
    { 
     while(flag.test_and_set(memory_order_acquire)); 
    } 
    void unlock() 
    { 
     flag.clear(memory_order_release); 
    } 
}; 

void foo() 
{ 
    static spinlock lock; 
    lock_guard<spinlock> guard(lock); 
    // do job 
} 

boost::lock_guard<boost::recursive_mutex> lock(m_guard);은 스택에 생성 될 것이다.

잠금이 아니며, 생성자에서 뮤텍스를 잠그고 소멸자에서 해제하는 RAII 래퍼입니다. 스택에 lock_guard를 만드는 것은 괜찮습니다.

+0

나는 atomic_flag를 사용할 수있는 기회가 결코 'atomic.hpp'에 없다? – Rajeshwar

+0

예 - http://www.boost.org/doc/libs/1_53_0/boost/atomic/atomic.hpp –

+0

답변 해 주셔서 감사합니다. – Rajeshwar