스 레 드 안전 과 재 입 가능 한 비교

저자: 영걸 출처:http://hi.baidu.com/duyingjie/blog/item/a489bf7ece9242360cd7dade.html
1 C 언어의 함수 에 있어 The terms reentrant and thread-safe are used to specify how a function can be used in multithreaded applications:  ****A reentrant function can be called simultaneously by multiple threads provided that each invocation of the function references unique data.  ****A thread-safe function can be called simultaneously by multiple threads when each invocation references shared data. All access to the shared data is serialized.
C 언어의 시대 에 다시 들 어 갈 수 있 는 함 수 는 한 함수 가 서로 다른 스 레 드 에 동시에 접근 할 때 모든 호출 은 자신의 데 이 터 를 혼자 사용 하고 여러 번 호출 할 때 데이터 공유 가 존재 하지 않 는 다 는 것 을 말한다.그래서 C 언어 가 다시 들 어 갈 수 있 는 함 수 는 반드시 라인 이 안전 하 다. 왜냐하면 여러 개의 라인 이 하나의 데 이 터 를 공유 하 는 문제 가 존재 하지 않 기 때문에 접근 충돌 이 발생 하지 않 는 다.함수 에 다시 들 어 갈 수 있 는 요 구 는 함수 가 전역 이나 정적 변수 에 접근 하지 않 는 것 입 니 다.
스 레 드 안전 만약 에 여러 스 레 드 가 같은 함수 에 대한 여러 번 호출 사이 에 공유 데이터 가 존재 한다 면 공유 데이터 에 대한 모든 방문 은 반드시 직렬 화 되 어야 합 니 다. 모든 스 레 드 는 선착순 으로 줄 을 서서 방문 해 야 합 니 다. 즉, 동시 방문 이 존재 하지 않 습 니 다.일 을 잘 하면 모두 가 맞 추 면 어 지 럽 지 않 고 각자 다 투 면 실수 하기 쉽다.
2 C + + 의 클래스 에 대해 말하자면, a class is said to be reentrant if each and every one of its functions can be called simultaneously by multiple threads on different instances of the class. 유사 하 게, class is said to be thread - safe if the functions can be called by different threads on the same instance.
그러나 C + + 시대 에 와 서 클래스 의 개념 을 도 입 했 고 클래스 구성원 함수 의 라인 안전 과 라인 이 다시 들 어 갈 수 있다 는 개념 을 도입 했다.이 개념 은 일반 함수 의 스 레 드 안전 과 스 레 드 를 다시 들 어 갈 수 있 는 확장 입 니 다.너 도 다른 개념 이 라 고 생각 할 수 있다.클래스 의 구성원 함 수 는 다시 들 어 갈 수 있 습 니 다. 클래스 의 구성원 함 수 는 여러 스 레 드 에 의 해 서로 다른 인 스 턴 스 에 접근 할 때 공유 데이터 가 존재 하지 않 고 데이터 충돌 도 발생 하지 않 습 니 다.클래스 의 재 입 가능 표시 클래스 의 모든 구성원 함 수 는 재 입 가능 합 니 다.클래스 의 스 레 드 안전 은 클래스 의 같은 인 스 턴 스 가 여러 스 레 드 에 접근 할 때 데이터 에 대한 조작 은 직렬 화 되 어 접근 충돌 이 없 을 것 이 라 고 말 합 니 다.
주해
이 몇 가지 개념 을 철저히 이해 하려 면 C / C + + 의 몇 가지 변수 유형 을 알 아야 한다.전역 변수 - 생명주기 와 프로 세 스 생명주기, 가시 역 은 전역 정적 변수 - 생명주기 와 프로 세 스 생명주기, 가시 역 은 변 수 를 정의 하 는 역 구성원 변수 - 생명주기 와 같은 실례, 가시 역 은 클래스 내부 (외부 에서 간접 적 으로 만 호출 할 수 있 거나 근본적으로 호출 할 수 없 음) 임시 변수 - 생명주기 가 변 수 를 정의 하 는 역 내 에서보 이 는 도 메 인 은 변 수 를 정의 하 는 도 메 인 입 니 다.
      위 에서 말 한 두 가지 재 입 함수 의 공통점 은 함수 가 정적 또는 전역 변 수 를 방문 할 수 없다 는 것 이다.그러나 C 언어 는 구성원 변수 가 없 기 때문에 다시 들 어 갈 수 있 는 함 수 는 임시 변수 에 만 접근 할 수 있 습 니 다. 여러 스 레 드 는 같은 함수 의 두 호출 에 데이터 공유 가 없 을 뿐만 아니 라 접근 충돌 도 존재 하지 않 습 니 다. 따라서 C 언어 유형의 재 들 어 갈 수 있 는 함 수 는 스 레 드 안전 입 니 다.       그러나 C + + 의 구성원 함수 에 있어 서 그들 은 구성원 변 수 를 방문 할 수 있 기 때문에 같은 인 스 턴 스 가 서로 다른 스 레 드 에 접근 할 때 데이터 공 유 를 초래 할 수도 있 고 스 레 드 가 안전 하지 않 을 수도 있 습 니 다.그래서 다시 들 어 갈 수 있 는 구성원 함수 가 반드시 라인 이 안전 한 것 은 아니다.      C 언어의 함수 든 C + + 류 의 구성원 함수 든 라인 이 안전 한 함수 가 반드시 다시 들 어 갈 수 있 는 것 은 아니다.
예 1 다시 들 어 갈 수 있 지만 라인 이 안전 하지 않 은 구성원 함수
class Counter
{
public:
Counter() { n = 0; }
 
void increment() { ++n; }
void decrement() { --n; }
int value() const { return n; }
 
private:
int n;
};

4 이 두 개념 과 자물쇠 의 관계      또한 개념 을 다시 입력 할 수 있 는 것 은 함수 가 접근 하 는 변수 유형 과 만 관련 이 있 습 니 다. 자 물 쇠 를 사용 하 는 지 여부 와 관계 가 없습니다!       한편, 스 레 드 안전 과 자물쇠 의 사용 관계 가 밀접 하고 스 레 드 안전 은 자물쇠 로 보장 되 는 경우 가 많다.

좋은 웹페이지 즐겨찾기