본문 바로가기

개발자노트

Thread Safe(쓰레드 세이프)

thread safe란 것은 여러 thread가 동시에 사용되어도
안전하단 말입니다.

보통 재진입 가능하게 만들어진 함수일 경우는 스레드 세이프이고,
전역 변수를 사용하지 않게끔 구성하게 되죠...

예를 들어

int a;

int inc(int n)
{
	a += n;
	return a;
}

라는 코드가 있다고 합시다.

만약 한개의 thread만이 동작하고 있다면 아무 문제 없이 동작하게 됩니다만!!

여러개가 사용한다고 했을때는 문제가 달라지게 되죠.

A라는 쓰레드가 1번라인을 수항하고 있는와중에 schedule되어서 B쓰레드가 다시 이 함수를 콜하게 되면...
엉뚱한 값을 리턴하게 됩니다.

해결방법으론 전역변수를 최대한 제거를 하고,
불가능 하다면 mutex를 사용하여야 겠지요...

pthread를 예로 들면

int a;
pthread_mutex_t a_lock = PTHREAD_MUTEX_INITIALIZER;

int inc(int n)
{
	pthread_mutex_lock(&a_lock);
	/* critical section */
	a += n;
	pthread_mutex_unlock(&a_lock);
}

이런식으로 하면 되겠죠...

standard library에 있는 몇몇 함수중에 thread safe하지 않은것이 있는데...
대표적인 예로 gmtime이 있죠...

gmtime은 내부적으로 static으로 선언된 변수의 포인터를 리턴하게 되는데,
위에서 지적한 전역변수를 사용하기 때문에 thread safe하지 못하게 됩니다.
gmtime대신 gmtime_r을 사용하면 해결 됩니다...

/***********************
* while(1) sleep(INFINITE);
***********************/



출처  https://kldp.org/node/36904