스핀락(Spinlock)

김 무무 ㅣ 2024. 10. 12. 00:03

1. 스핀락이란

동기화 메커니즘의 한 종류로, 바쁜 대기(Busy waiting) 방식을 사용한다.

lock을 획득하려는 스레드가 lock이 해제될 때까지 계속해서 lock의 상태를 확인한다.

이 과정에서 CPU 사이클을 소비하며 "spin"(회전)한다고 표현한다.

일반적으로 atomic 변수를 사용하여 구현한다.

 

 

2. 스핀락 vs 일반 Lock

스핀락:

  - 짧은 임계 영역, 컨텍스트 스위칭 비용이 큰 경우

  - CPU 사용률이 높지만, 대기 시간이 짧음

 

일반 Lock:

  - 긴 임계 영역, 대기 시간이 길 수 있는 경우

  - CPU 사용률이 낮지만, 컨텍스트 스위칭으로 인한 오버헤드 발생

 

 

3. 스핀락 사용 시나리오

lock을 획득할때까지 계속해서 lock의 상태를 확인하기 때문에 빠른 연산이나 짧은 임계 영역에 적합하다.

 

ex)

#include <iostream>
#include <thread>
#include <vector>
#include <atomic>
using namespace std;
class Spinlock {
    // 스핀락 구현 클래스
private:
    atomic_flag flag = ATOMIC_FLAG_INIT;

public:
    void lock() {
        while (flag.test_and_set(memory_order_acquire)) {
            // Spin
        }
    }
    void unlock() {
        flag.clear(memory_order_release);
    }
};

Spinlock spinlock;
int num = 0;

void Increment(int iterations) {
    for (int i = 0; i < iterations; i++) {
        spinlock.lock();
        num++;
        spinlock.unlock();
    }
}

int main() {
    const int threadCount = 4;
    const int iterationCount = 100000;

    vector<thread> threads;

    for (int i = 0; i < threadCount; i++) {
        threads.emplace_back(Increment, iterationCount);
    }

    for (auto& thread : threads) {
        thread.join();
    }

    cout << "값: " << num << endl;
}

'멀티스레딩' 카테고리의 다른 글

Condition Variable  (0) 2024.10.16
C++ 비동기 프로그래밍  (0) 2024.10.15
데드락(Deadlock)  (1) 2024.10.07
동기화 기법: Mutex  (0) 2024.10.05
동기화 기법: Lock  (0) 2024.10.05