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 |