2014-11-20 1 views
2

그래서 assert가 다중 스레드 컨텍스트에서 사용 가능한지에 대한 확실한 정보를 찾을 수없는 것 같습니다.assert() 안전성 멀티 스레드 컨텍스트

어설 션이 스레드가 종료되지만 다른 스레드가 실패하면 나에게 논리적 인 것처럼 보입니까?

전체 프로세스가 종료 되나요?

기본적으로 내 질문입니다. 자원 누출없이 다중 스레드 환경에서 assert를 사용하는 것이 안전합니까? 당신이 assert()man page 보면, 그것은 분명 상태

+0

'누출 리소스 없음'assert() 프로그램을 강제 종료합니다. 다중 쓰레드 든 단일 쓰레드 든간에 자원을 확보 할 수 없습니다. 기본적으로 디버깅 용입니다. 정말로 자원을 해방시켜야합니까? – ikh

+0

"고체 정보"는 어디에서 찾으셨습니까? 맨 페이지가 "abort"를 호출하여 프로그램을 종료한다는 사실을 분명히 알지 못합니까? –

+0

스레드가 수행중인 함수가 종료되지 않은 경우 스레드가 프로그램 종료시 종료되지 않는다는 인상하에있었습니다. –

답변

4

,

이 매크로의 목적은 프로그래머가 자신의 프로그램의 버그를 찾을 수 있도록하는 것입니다. "foo.c 파일에서 어설 션이 실패했습니다. 함수 do_bar(), 1287 행"은 사용자에게 전혀 도움이되지 않습니다.

이것은 프로덕션 소프트웨어가 아닌 개발 환경에서만 유용하다는 것을 의미합니다. IMO는 개발 단계에서 assert()으로 인한 leak에 대해 걱정할 필요가 없습니다. YMMV.

당신은 당신의 코드를 디버깅 완료되면

을 수행 할 수 있습니다 단순히 [#define] NDEBUG을 정의하여assert() 기능 해제 스위치.

3

나는 네 이상이라고 말하고 싶습니다. 주장하지 않고 다중 스레드 코드를 볼 수 있다면 신뢰하지 않을 것입니다.

#define assert(x) if(!(x)) abort() 

당신이 스레드 안전 또는 스레드 별 특별 아무것도하지 않는 것을 볼 수 있습니다 : 당신은 같은에 약간에게 그것의 구현을 단순화합니다. 레이스 프리 조건을 제공하는 것은 귀하의 책임이며 주장이 실패하면 전체 프로세스가 중단됩니다.