2010-10-27 10 views
17

세그먼트 화 오류를주는 프로그램을 디버깅하는 데 시간을 보내고 있습니다. 이 버그는 꽤 비결정적이고 간헐적이며 성가시다. 나는 strtok의 부름에 그것을 좁혔다. 세그먼트 화 오류를 일으키는 두 개의 다른 스레드에서 문자열을 분할하는 것이 strtok의 호출이라고 생각합니다. strtok을 두 개의 다른 스레드에서 호출 할 수 있습니까?strtok 함수 스레드 안전

감사합니다.

+0

사실 C 질문 인 경우 C++에 질문을 태그하지 마십시오. –

답변

35

strtok()은 재진입 가능하지 않으므로 스레드 응용 프로그램에서 사용하면 안됩니다. 대신 strtok_r()을 사용하십시오.

+0

Dev-C++을 사용하여 C 프로그램을 만들었으며 strtok_r을 사용할 수 없었습니다. (표준/버전/컴파일러 devcpp가 –

+0

을 사용하는지 확실하지 않습니다. strtok의 POSIX 표준 버전에는 추가 포인터가 있습니다. 그래서 다른 포인터를 사용하는 다른 밟기가있는 한이 버전은 스레드로부터 안전합니다. – Calmarius

6

strtok()은 중간 변수를 저장하고 각 호출에서 다시 사용하기 때문에 MT 안전하지 않습니다. strtok()을 호출 할 때마다 다시 문자열을 전달할 필요가 없습니다. 사용중인 메소드의 매뉴얼 페이지를 볼 수 있으며, MT가 안전한지 여부는 항상 맨 끝에 표시됩니다.

메쏘드가 MT-safe (multi-thread safe 또는 reentrant)가 아닌 경우, _entr을 의미하는 접미사 _r과 동일한 메소드를 찾아야합니다. 귀하의 예에서는 strtok_r()이 다른 대답에서 제안되었습니다.