2012-01-15 2 views
10

가능한 중복 :
Malloc thread-safe?malloc()은 재진입 적이 지 않지만 스레드로부터 안전합니까?

나는하지 조금 혼란 내가 "리눅스 프로그래밍 인터페이스"를 읽고있다 동안입니다.

책에서 전역 연결 목록 데이터 구조를 조작하지만 뮤텍스를 사용하여 스레드로부터 안전 해지므로 malloc은 재진입 성이 없다고 말합니다.

나는 이것에 관해 약간 혼란 스럽다 : 뮤텍스를 사용하여 스레드로부터 안전하므로 동시에 둘 이상의 스레드가 호출 할 수 있기 때문에 왜 재진입 함수가 아닌가? (재진입 성은 동시에 둘 이상의 호출자가 호출 할 수 있다는 것을 말하는 경우)

또 다른 질문은 malloc은 스레드로부터 안전하므로 신호 처리기에 넣을 수 있습니까? 나는 대답이 '예'라고 생각하지만,이 책에 따르면, 재진입 또는 비동기 신호 안전 기능 만 신호 처리기에 넣을 수 있다고 말하고 있기 때문에 확실하지 않습니다.

누구든지 나에게 설명 할 수 있습니까?

+0

malloc의 구현에 뮤텍스가 포함되어 있습니까? – Bingo

답변

23

우리는 재진입이

잘못된 동시에 하나 이상의 호출자가 호출 될 수 있다는 것을 의미 있다고합니다. 재진입은 을 의미하며, 이전 화신이 종료되기 전에 다시 호출 할 수 있습니다.. 상상의 malloc은 다음과 같습니다가 중간에 중단되면

lock(mutex); 

/* Stuff. */ 

unlock(mutex): 

어떻게됩니까, 의 잠금을 해제하기 전에 다른 사람이 malloc를 호출?

  • 첫 번째 상황은 두 번째가 뮤텍스에
  • 두 번째 상황에 맞는 블록을 끝날 때까지 계속할 수 없습니다 첫 번째는 교착 상태의 뮤텍스

의 잠금을 해제 할 때까지 계속할 수 없습니다.

또 다른 질문은 malloc은 스레드로부터 안전하므로 신호 처리기에 을 넣을 수 있습니까? 나는 대답이 예라고 생각한다.

틀린 다시. 위의 예를 참조하십시오. 주 프로그램이 malloc을 수행 중이며 함수가 실제로 처리기를 종료하기 전에 malloc을 호출한다고 가정 해보십시오.

+0

감사합니다. cnicutar, 대답은 매우 명확합니다 !! – kai

+0

@kai : POSIX의 이전 버전 (2008 년 이전)이 thread-safe를 의미하기 위해 재진입 성 단어를 잘못 사용했다는 사실로 인해이 개념을 혼란스럽게하는 문제가 악화됨에 유의하십시오. –

2

재진입 성과 스레드 안전은 두 가지 개념입니다. 재진입 함수는 비 thread-safe가 될 수 있고 스레드 안전 함수는 재진입이 불가능할 수 있습니다.

C의 라이브러리 함수는 재진입 가능하지 않으며 신호 핸들러에서 재진입 함수 만 호출 할 수 있습니다.

+0

' thread-safe' ... 할 수 있을까요? –

+4

@iuliux : 예. 일부 시스템에서는 정적 변수가 스택 기반 로컬 변수보다 빠릅니다. 엔트리에서 스택에 정적 변수를 복사하고 정적 변수를 사용하고 스택에서 변수를 다시 입력하지만 스레드로부터 안전하지 않게 복원하는 코드 – supercat

관련 문제