From IdeA thinKING
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의 동작 원리를 쉽게 알 수 있습니다.