2010-06-16 2 views
3

모든 재귀 함수가 재진입 성이 필요하다고 말하는 것이 사실입니까?Reentrancy and recursion

+0

가능한 숙제로 태그가 지정되었습니다. – ivans

+0

숙제가 아니라 단지 내가 가진 질문입니다. 더 이상 학교에 없습니다. at –

+0

Retagged : recrusion => recursion – pakore

답변

0

전혀 아님.

재귀 함수가 정적 데이터를 가질 수없는 이유는 무엇입니까? 중요한 섹션을 잠그지 않아야합니까?

고려 :

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); 
} 

이 둘은 일반적인 패턴입니다, 재귀 및 재진입 함수를 작성하는 것은 쉬운 말을 이동하지 않으며 어떤 식 으로든 것을 권장하지 않습니다. 하지만 가능합니다.

+0

왜 재진입 함수에 정적 데이터가 없어야합니까? –

+0

Daniel : 다른 정의가 없다면 http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29에 위배됩니다. –

+0

그 페이지는 터무니입니다 (토론 페이지 확인). 파일 시스템에 액세스하기위한 API를 고려하십시오. 공유 된 전역 데이터에 액세스하지만 동시에 여러 스레드/프로세스에서 동시에 호출 할 수 있습니다. –

0

아니요, 정적 (전역) 변수와 함께 작동하는 계승 함수를 상기합니다. 정적 (전역) 변수를 갖는 것은 재진입성에 위배되며, 여전히 함수는 재귀 적입니다.

global i; 

    factorial() 
    { if i == 0 return 1; 
     else { i = i -1; return i*factorial(); 

    } 

이 함수는 재귀 적이며 재귀가 아닙니다.

1

'재진입'은 일반적으로 두 개의 다른 스레드가 한 번에 여러 번 기능을 입력 할 수 있음을 의미합니다.

재진입 가능하려면 정적 상태에 대한 액세스를 보호/잠그는 등의 작업을 수행해야합니다.

재귀 함수 (다른 한편으로는)는 한 번에 하나의 명령문만을 실행하기 때문에 정적 상태에 대한 액세스를 보호하거나 잠글 필요가 없습니다.

So : no.

+2

스레드 안전 있지만 재진입 기능이없는 것은 가능합니다 (단일 스레드 응용 프로그램의 경우에도 마찬가지 임). 사실 http://en.wikipedia.org/wiki/Reentrancy_(computing)의 예가 있습니다 – sashoalm

0

정확하게는 아닙니다. 재진입 함수는 다른 스레드와 동시 실행을 처리 할 수 ​​있어야합니다.

재귀 함수는 아직 실행 중이지만 다른 스레드가 아닌 제어 된 방식으로 항목을 처리 할 수 ​​있어야합니다.

2

재진입은 이전 호출이 끝나기 전에 추가 호출이 시작될 수 있음을 의미합니다. 그렇다면 재귀가 그 의미에서 재진입을 의미하기 때문에 모든 재귀 함수가 재진입 가능합니다.

그러나 "재진입 성"은 때때로 "스레드 안전성"의 동의어로 사용되며 다른 많은 요구 사항을 도입하며 그 의미에서 대답은 아니오입니다. 단일 스레드 재귀에서는 스택의 "유휴"인스턴스가 "자식"인스턴스가 반환되기를 기다리고 있기 때문에 한 번에 하나의 "인스턴스 인스턴스"만 실행되는 특별한 경우가 있습니다.

+2

재진입 및 스레드 안전은 다음과 같은 것은 아닙니다 : http://en.wikipedia.org/wiki/Reentrant_(subroutine) –