모든 재귀 함수가 재진입 성이 필요하다고 말하는 것이 사실입니까?Reentrancy and recursion
답변
전혀 아님.
재귀 함수가 정적 데이터를 가질 수없는 이유는 무엇입니까? 중요한 섹션을 잠그지 않아야합니까?
고려 :
sem_t mutex;
int calls = 0;
int fib(int n)
{
down(mutex); // lock for critical section - not reentrant per def.
calls++; // global varible - not reentrant per def.
up(mutex);
if (n==1 || n==0)
return 1;
else
return fib(n-1) + fib(n-2);
}
이 둘은 일반적인 패턴입니다, 재귀 및 재진입 함수를 작성하는 것은 쉬운 말을 이동하지 않으며 어떤 식 으로든 것을 권장하지 않습니다. 하지만 가능합니다.
왜 재진입 함수에 정적 데이터가 없어야합니까? –
Daniel : 다른 정의가 없다면 http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29에 위배됩니다. –
그 페이지는 터무니입니다 (토론 페이지 확인). 파일 시스템에 액세스하기위한 API를 고려하십시오. 공유 된 전역 데이터에 액세스하지만 동시에 여러 스레드/프로세스에서 동시에 호출 할 수 있습니다. –
아니요, 정적 (전역) 변수와 함께 작동하는 계승 함수를 상기합니다. 정적 (전역) 변수를 갖는 것은 재진입성에 위배되며, 여전히 함수는 재귀 적입니다.
global i;
factorial()
{ if i == 0 return 1;
else { i = i -1; return i*factorial();
}
이 함수는 재귀 적이며 재귀가 아닙니다.
'재진입'은 일반적으로 두 개의 다른 스레드가 한 번에 여러 번 기능을 입력 할 수 있음을 의미합니다.
재진입 가능하려면 정적 상태에 대한 액세스를 보호/잠그는 등의 작업을 수행해야합니다.
재귀 함수 (다른 한편으로는)는 한 번에 하나의 명령문만을 실행하기 때문에 정적 상태에 대한 액세스를 보호하거나 잠글 필요가 없습니다.
So : no.
스레드 안전 있지만 재진입 기능이없는 것은 가능합니다 (단일 스레드 응용 프로그램의 경우에도 마찬가지 임). 사실 http://en.wikipedia.org/wiki/Reentrancy_(computing)의 예가 있습니다 – sashoalm
정확하게는 아닙니다. 재진입 함수는 다른 스레드와 동시 실행을 처리 할 수 있어야합니다.
재귀 함수는 아직 실행 중이지만 다른 스레드가 아닌 제어 된 방식으로 항목을 처리 할 수 있어야합니다.
재진입은 이전 호출이 끝나기 전에 추가 호출이 시작될 수 있음을 의미합니다. 그렇다면 재귀가 그 의미에서 재진입을 의미하기 때문에 모든 재귀 함수가 재진입 가능합니다.
그러나 "재진입 성"은 때때로 "스레드 안전성"의 동의어로 사용되며 다른 많은 요구 사항을 도입하며 그 의미에서 대답은 아니오입니다. 단일 스레드 재귀에서는 스택의 "유휴"인스턴스가 "자식"인스턴스가 반환되기를 기다리고 있기 때문에 한 번에 하나의 "인스턴스 인스턴스"만 실행되는 특별한 경우가 있습니다.
재진입 및 스레드 안전은 다음과 같은 것은 아닙니다 : http://en.wikipedia.org/wiki/Reentrant_(subroutine) –
- 1. Python : Recursion
- 2. XSLT 1.0 recursion
- 3. haskell beginner - recursive recursion
- 4. C : sprintf 및 recursion
- 5. Sudoku Recursion Issue (Java)
- 6. cakePHP, Model Recursion
- 7. The Definitive Tail-Call Recursion Question
- 8. 속성 요청을 추적하는 Mixin 클래스 - __attribute__ recursion
- 9. PHP recursion - notice : undefined offset : 20 array
- 10. SubSonic "Or"AND "AND"
- 11. jquery and jScrollPane and ajax
- 12. EOR/XOR에서 AND carry 플래그 AND
- 13. ReviewBoard and Hudson and Subversion/CVS
- 14. Objective-J and Cappuccino and CGRect
- 15. F # : Asynch and Tasks and PLINQ, 이런!
- 16. Ninject and dynamic WithConstructor/WithMeta and RhinoMocks
- 17. mysql_real_escape_string and '
- 18. $ 또는 and "and"in mongo query in java driver?
- 19. 개인 AND 정적 AND 상속 된 변수 !? 또는 이와 비슷한
- 20. POCO C++ and computer sleep and wake up
- 21. 그때 그때의 경우 AND but 조건 안에 AND
- 22. NSOutlineView, NSTreeController and willDisplayCell
- 23. Powershell and Automation
- 24. jQuery and Safari
- 25. Adobe Air and PHP
- 26. XUL and document.write()
- 27. ClickOnce and Security
- 28. Jquery and ShadowBox
- 29. cgi and tomcat
- 30. Castor and IKVM
가능한 숙제로 태그가 지정되었습니다. – ivans
숙제가 아니라 단지 내가 가진 질문입니다. 더 이상 학교에 없습니다. at –
Retagged : recrusion => recursion – pakore