2011-12-11 2 views
2

는이 같은 코드의 조각을보고이 스레드 안전한지 궁금 : 내가 해결하고,이 코드는 스레드로부터 안전하지 않습니까?

int savedErrno = errno; 

//call some function that may modifies errno 

if (errno == xxx) 
    foo(); 

errno = savedErrno; 

내가이 스레드 안전하다고 생각하지 않는다?

는하지만 사람들이 이런 식으로 코드를 작성했다, 그래서 나는

+0

왜 안전하지 않습니까? – littleadv

+0

안전하지 않은 부분은 어디에서 보입니까? – ScarletAmaranth

+0

@littleadv 스레드로부터 안전하지 않은 이유는 errno가 전역 변수이므로 모든 스레드가 공유하기 때문입니다. 영리한 시스템 구현자가 전역 변수를 매크로 매직 (macro-magic)으로 대체하여 스레드 별 로컬 변수마다 errno를 만들 때까지 원래의 경우라고 생각합니다. IMO는 여전히 추악한 메커니즘입니다 ... –

답변

9

각 스레드는 자신의 (쓰레드 특정)가 ...

어느 한 감사, 내가이 명확하게 도울 수 ... 확실하지 않다 errno의 복사본이 안전해야하는 것처럼 보입니다. 사람에서

(3)의 errno :

의 errno는 int 형의 수정 좌변으로는 ISO C 표준에 의해 정의되며, 명시 적으로 선언되지 않아야합니다; errno는 매크로 일 수 있습니다. errno는 thread-local입니다. 한 스레드에서 설정해도 다른 스레드의 값에는 영향을주지 않습니다.

+0

안녕하세요, 오리 이제 나는 분명합니다. – kai

1

코드는 한 스레드에서만 errno를 사용하며 실제로 코드는 하나의 스레드 만 표시합니다. 이 스 니펫은 스레드로부터 안전합니다.

관련 문제