January 6, 2009, Tuesday, 5

Article:SpinMutex

From IdeA thinKING

Jump to: navigation, search

Spin Mutex 구현하기

출처: Imperfect C++: Practical Solutions for Real-Life Programming (ISBN: 0321228774)

아래와 같이 구현하고 거의 쓰레드간의 충돌이 없으나 가능성이 전혀 없지는 않은 곳에서만 사용합니다. 그렇지 않으면 높은 성능상의 penalty를 가지게 될 수 있습니다.

class spin_mutex
{
public:
  explicit spin_mutex(sint32_t *p = 0)
    : m_spinCount((0!= p) ? p : &m_internalCount), m_internalCount(0)
  {}
  void lock()
  {
    for (; 0 != atomic_write(m_spinCount, 1); sched_yield())
    {}
  }
  void unlock()
  {
    atomic_set(m_spinCount, 0);
  }
private:
  sint32_t *m_spinCount;
  sint32_t m_internalCount;
private:
  spin_mutex(spin_mutex const&);
  spin_mutex& operator=(spin_mutex const&);
};

여기서 atomic_set과 atomic_write는 각각 platform에서 제공하는 기능을 가지고 구현해야 하는 함수로 atomic_set은 변수의 값을 atomic하게 설정하는 함수이고 atomic_write 함수 역시 atomic하게 변수에 값을 설정하고 변경되기 전의 값을 돌려주는 함수입니다.

이 코드로 spin mutex의 동작 원리를 쉽게 알 수 있습니다.