2009-09-16 3 views
1
void reverse_string(char* string, int str_size) { 
    char tmp; 
    int i = 0; 
    int j = str_size - 1; 
    while (i < j) { 
     tmp = string[i]; 
     string[i] = string[j]; 
     string[j] = tmp; 
     ++i; 
     --j; 
    } 
} 

이 함수는 모든 전역 변수를 사용하지 않기 때문에 재진입 함수라고 생각합니다. 인수 만 수정합니다.이 함수는 재진입 성입니까?

내 질문 : 이 함수는 재진입 성입니까? 그렇다면 내 주장은 충분히 좋은가요?

미리 감사드립니다.

+4

평등 가드'if (i == j)'가 불필요하다고 생각합니다. 이미'i'가'j'보다 엄격하게 작다는 것을 요구했습니다. – dmckee

+0

좋은 찾기. 그것은 제거되었습니다 – Quincy

+1

순수하게 참조 용으로 "foo"가 가변 문자열 인 std :: reverse (foo, foo + strlen (foo))를 사용하여 동일한 효과를 얻을 수 있습니다. AFAIK, 대부분의 std :: reverse() 구현은 이러한 기본 반복기, 즉이 경우 포인터를 사용할 때 스레드로부터 안전하고 재진입 가능합니다. strlen() 주석이 게시 한 내용은 여전히 ​​적용됩니다. – Void

답변

14

예, 이것은 재진입 기능입니다. 재진입 함수는 재귀 또는 동시성으로 인해 실행될 때 호출 할 수있는 함수로 정의됩니다. 이 경우 재귀는 의미가없고 동시에 안전합니다 (다른 매개 변수가 있다고 가정).

귀하의 주장은 훌륭합니다. 명백하게 또는 암묵적으로 액세스되는 전역 또는 공유 상태가 없기 때문에 재진입이 보장됩니다. 이는 명시 적 코드와 C의 의미의 조합입니다. 다른 언어 및 API 에는이 속성이 없습니다.

편집 : 이중 검사에서 ISO C 표준은 strlen의 스레드 안전성을 강요하지 않는 것으로 보입니다. 이와 같이, 당신은 C 쓰레드 라이브러리를 비 쓰레드 안전 strlen과 함께 사용할 수있는 작은 가능성이 있으며, 그로부터 non-reentrancy를 상속받습니다.

11

네, 맞아요, 재진입니다. 매개 변수와 로컬 변수에만 영향을 미칩니다.

다른 인스턴스가 방해 할 수있는 유일한 방법은 동일한 버퍼에 포인터를 전달하는 것입니다.

좋은 definition of reentrant on Wikipedia가 있으며 귀하의 기능이 모든 조건을 분명히 충족합니다.

4

그것은 단지 인수가

Wikipedia 재진입로 제공하는 것을 몇 가지 좋은 점을 제공한다 수정 같은 네, 재진입입니다 :

:

것은 재진입, 컴퓨터 프로그램 또는 루틴하기를

  • 정적 (또는 전역) 상수가 아닌 데이터를 보유해야합니다.
  • 주소를 고정 (또는 전역) 상수가 아닌 데이터로 반환하지 않아야합니다. 발신자가 제공 한 데이터에서만 작동해야합니다.
  • 싱글 톤 리소스에 대한 잠금에 의존해서는 안됩니다.
  • 자체 코드를 수정해서는 안됩니다. 1 (고유 한 스레드 저장소에서 실행하지 않는 경우)
  • 재진입 불가능한 컴퓨터 프로그램이나 루틴을 호출하면 안됩니다.
2

strlen이 재진입 성 있다고 가정해야합니다 (아마).

+1

그는 코드 샘플을 편집하여'strlen'이 여기에 재진입 할 ​​필요는 없습니다. – mbx