버그 해결을 위한 모든 질문을 던져
0 votes
152 views

안녕하세요? 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;
}

 

asked (24 point) , 152 views
소스 전문을 올려주시면 다른 분들이 같이 디버깅해 드리기 좀 더 쉬울 것 같네요. 지금은 소스의 일부 뿐이라... 다른 부분들도 마져 올려주시면 좋을 것 같네요.

1 답변

0 votes

그 이유는 compare_exchange_weak의 expected가 레퍼런스로 넘겨지기 때문입니다.

compare_exchange가 실패한다면 expected는 원래 atomic 변수가 갖던 값으로 대체됩니다.

여기 예제를 참고해보세요.

std::atomic<T>::compare_exchange_weak, std::atomic<T>::compare_exchange_strong - cppreference.com

 

answered (10 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

597 질문
758 answers
727 댓글
118,330 users