2012-05-06 4 views
0

나는 여러 개의 pthread가있는 프로그램이 있습니다. 이 스레드는 공용 파일에서 get 및 set 함수를 통해 정적 변수로 데이터를 다시보고합니다. 하나 개의 스레드가 getLAT();를 실행하고 다른 동시에 setLAT();를 실행하는 경우 동시에 변수 읽기 및 쓰기

static int LAT; 
void getLat(){ 
    return LAT; 
} 
void setLAT(int lat){ 
    LAT = lat; 
} 

은 어떻게됩니까? 내 프로그램이 추락할까요? 그렇다면 어떻게 이것을 막을 수 있습니까?

+1

크래시가 발생하지 않지만 어떤 값을 얻는지는 불가능합니다. 문자 그대로 그것은 경쟁 조건입니다. –

+0

설정중인 것 또는 이미있는 것 이외의 것이 있습니까? – Reid

+0

'LAT'에 대한 타입 선언이 누락되지 않았습니까? – gcbenison

답변

3

이 상태를 경쟁 조건이라고하며 정의되지 않은 동작이 발생합니다. 어떤 일이든 일어날 수있다. 크래시가 발생하지 않을 가능성이 있습니다. 결과는 쓰기 전, 쓰기 후 또는 손상된 중간 값 중 하나 일 수 있습니다.

시스템 콜에서 또는 포인터 오프셋으로 손상된 값을 사용하려고하면 그 시점에서 충돌이 발생합니다.

일부 플랫폼 및 아키텍처는 특정 주소에 정렬 된 특정 크기의 객체 (예 : 16 바이트 주소에 정렬 된 경우 원자 4 바이트 읽기 등)에 대한 원자 읽기/쓰기를 보장합니다.이 경우 중간 값 (손상)는 일어나지 않을 것이다. 그러나 휴대용이 아니기 때문에 당신은 그 행동에 정말로 의지 할 수 없습니다. 그리고 그 동작이 보장되지 않을지라도 코드는 99 %의 시간 동안 정상적으로 작동 할 것입니다. 단 한 번의 생산을 제외하고는 바로 가기를 사용하지 않았고 동기화가 필요하지 않았 으면 좋겠습니다.

이 경쟁 조건에서 코드를 보호하려면 cmpxchg와 같은 뮤텍스 또는 원자 읽기/쓰기 명령어를 사용해야합니다.

+0

어떻게 이것을 막을 수 있습니까? – Reid

+0

업데이트 된 회신을 참조하십시오. –

+0

고맙습니다. 도움이되었습니다. – Reid