내부적으로 lock의 권한에 지속적으로 접근을 하여 CPU의 부하를 준다.
lock의 권한을 짧게짧게 가지는 스레드에는 효과적이지만
lock을 오랜시간 갖게되는 스레드에는 적합하지 않다.
코드
#include "pch.h" #include <iostream> #include "CorePch.h" #include <thread> #include <atomic> #include <mutex> class SpinLock { public: void lock() { // CAS (Compare-And-Swap) bool expected = false; // 예상값 bool desired = true; // 결과값 // CAS 의사 코드 if (locked == expected) { // 만약 locked가 expected면(예상하는 값이면) locked = desired; // locked를 desired 값으로 바꿔주고 return true;// true로 반환한다. } else { expected = locked; // 만약 locked가 expected가 아니면 expected를 locked 값으로 바꿔주고 return false; // false로 반환한다. } while (locked.compare_exchange_strong(expected, desired) == false) { expected = false; } locked = true; } void unlock() { locked = false; } private: atomic<bool> locked = false; }; i32 sum = 0; SpinLock mut; void add() { for (i32 i = 0; i < 100'0000; i++) { lock_guard<SpinLock> guard(mut); sum++; } } void sub() { for (i32 i = 0; i < 100'0000; i++) { lock_guard<SpinLock> guard(mut); sum++; } } int main() { std::thread thread1(add); std::thread thread2(sub); thread1.join(); thread2.join(); cout << sum << endl; }
댓글