06_spin lock

06_spin lock

날짜
생성자
ShalomShalom
카테고리
pararell
작성일
2023년 05월 15일
태그
c++
이전 블로그
내부적으로 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; }

댓글

guest