2014-12-04 3 views
1

재진입 코드가 무엇을 의미하는지 정확히 이해하려고합니다. 이 코드는 다음과 같습니다.재진입 코드 혼란

void HWt::startElement(uint8_t HW, uint8_t val) 
{ 
    writeBitsToregister(REG_VAL + HW*131072, 0, 3, val); //Write bits 0-2 
    writeBitToregister(REG_VAL, 3, 1); //Set bit 3 to 1 
    writeBitToregister(REG_VAL, 3, 0); //Set bit 3 to 0 
} 

모든 비트 쓰기가 원자 적이어야합니다. 나는 이것이 재진입 적이라고 들었다. 내가 쓰레드를 안전하게 만드는 방법을 이해할 수있다. 뮤텍스 만 사용할 수있다.

재입 개가 안전하려면 어떻게해야하나요? 또한, 여기에 재진입 사실이 무엇을 의미하는지 이해할 수 없습니까? 같은 스레드가이 함수에 여러 번 액세스 할 수 있습니까? 이것이 ISR 또는 재귀 내에서 호출되는 경우에만 발생할 수 있습니까? 그것은이 두 가지 모두가 아닙니다.

+0

다시 참가자는 다른 스레드에서 "자신의 데이터와"같은 함수를 호출하는 것이 안전하다는 것을 의미한다. 난 REG_VAL 상수, 그래서 당신이 mutliple 스레드에서 동일한 레지스터에 영향을 미치고 있기 때문에 다른 스레드에서 동시에이 함수를 호출 안전하다고 가정합니다. 이것은 재입국이 아닙니다. 물론 이것은 스레드로부터 안전하지 않습니다. – alediaferia

+0

스레드 안전 부분은 분명합니다. 이해합니다. 그러나 이것이 왜 재진입이 아닌가? 이것은 동일한 스레드가이 코드에 액세스 할 수 없다는 것을 의미합니까? 즉 재귀 적으로 만들지 않거나 ISR에서 호출하지 마십시오. – user1876942

+0

나는 첫 번째 문장에서 그것을 언급했다. 재진입은 "다른"스레드의 "동일한"인수로 함수를 동시에 호출하는 것이 안전하다는 것을 의미합니다. 예를 들어'int sum (int a, int b) {return a + b; }'재입국 중입니다. – alediaferia

답변

3

재진입 안전은 함수가 실행되는 동안 "out of context"호출을 성공적으로 처리 할 수 ​​있음을 의미합니다. 최신 운영 체제의 커널이 아닌 코드에서 이것은 일반적으로 다른 스레드가 동시에 호출하는 것을 의미하므로이 경우 스레드로부터 안전하다는 것과 같습니다.

그러나, 예를 들어. MS-DOS 또는 커널 코드에서 인터럽트는 함수가 실행되는 동안 언제든지 발생할 수 있으며, 아마도 자체적으로 함수를 호출 할 수 있습니다. 이 기능을 특별히 피하기 위해 작성되지 않은 이상 이상한 부작용이있을 수 있습니다.

은 참조 : http://en.wikipedia.org/wiki/Reentrancy_%28computing%29

+0

그래서 기본적으로 ISR에서 해당 코드를 호출하거나 재귀 적으로 만들지 마십시오. 위키 링크를 읽었지만 100 % 명확 해지기를 원합니다. – user1876942

+1

전적으로 귀하가 일하고있는 환경에 달려 있습니다. 인터럽트를 끄고, 인터럽트 핸들러 등에서 함수를 호출하는 것을 피하십시오. –

+1

좋습니다, 그건 제 생각이었습니다. ISR에서 호출하거나 재귀 적으로 호출해서는 안된다는 것을 문서화합니다. 인터럽트를 비활성화하지 않을 것입니다. 감사. – user1876942