안녕하세요? c++ 공부를하고있는 학생입니다.
스핀락과 관련하여 구현중 의문이 생겨서 질문을 남깁니다.
void SpinLock::Lock()
{
int exchanged = 1;
int expected = 0;
while (true) {
//int exchanged = 1;
//int expected = 0;
if (_lock.compare_exchange_weak(expected,exchanged,std::memory_order::memory_order_acquire)) {
break;
}
}
}
위의 방식으로 lock을 하려고하는데.. while문 내부에 해당 변수를 정의하여 사용한 경우 제대로 값이 측정됐으나
외부에 해당 변수를 정의하여 사용한 경우 락을 사용하지 않은 경우와 같은 문제가 발생했습니다.
아무리 고민을 해봐도 차이점을 잘 모르겠습니다 ㅜ. 밑의 코드는 main 함수쪽 코드입니다.
#include <iostream>
#include "SpinLock.h"
int count = 0;
SpinLock locker;
void func()
{
for (int i = 0; i < 100000; i++) {
locker.Lock();
count++;
locker.Release();
}
}
void func2()
{
for (int i = 0; i < 100000; i++) {
locker.Lock();
count--;
locker.Release();
}
}
int main()
{
std::thread t1(func);
std::thread t2(func2);
t1.join();
t2.join();
std::cout << count << std::endl;
}