2014-03-29 3 views
3

libstdC++ 코드를 조사한 결과, operator>> 또는 operator<<이 취소 점 pthread (이는 올바르게 이해하면 특수 마법 예외 객체를 던짐으로써 구현 됨)로 인터럽트 된 it sets the badbit on a stream에 놀랐습니다.istream/ostream의 IO 기능에서 pthread를 취소하면 badbit이 설정되는 이유는 무엇입니까?

분명히 C++ 표준에서는 해당 I/O 함수로 이스케이프하는 예외가 badbit를 설정해야합니다. 그러나 내 이해를 위해 pthread 취소는 C++의 "예외"로 간주 할 필요가 없습니다.

cout과 친구들을 사용하는 스레드 pthread_cancel을 호출 할 때 입출력을 수행하는 스레드가 종료 된 후에 항상 badbit를 지워야한다는 의미입니까? (스레드가 badbit를 발생시킨 경우를 대비하여) 설정 되나요?)

+0

스레드 종료는 대개 잘못된 생각으로 간주됩니다. – Puppy

+1

스트림 추출 중에 이러한 취소가 발생한 후에 어떻게 스트림을 사용 하시겠습니까? 다른 스레드는 얼마나 많은 문자가 추출되었는지, 또는 취소 된 추출에서 "남은 부분"이 있는지를 알지 못합니다. 마찬가지로, 삽입의 경우, 스트림은 삽입 된 데이터가 유효한 상태임을 보증 할 수 없습니다. – dyp

+0

@DeadMG 동의하며 그렇게하지 않습니다. 그러나 우리가 나쁜 일을 더 악화 시키면 안됩니다. 그래서 libstdC++가 이런 식으로하는 이유가있을 것입니다. –

답변

1

C++ 표준은 pthread의 특별한 예외에 대한 특정 동작을 지정하지 않습니다. 그러나 예외를 catch하면 std::ios_base::badbit으로 설정됩니다. 특별 예외를 처리하기 위해 표준을 보강해야합니다. C++ 표준과는 별도로 다른 표준을 사용하는 상호 작용은 C++ 표준 외부에 있습니다.

하나의 Kona 회의 (~ 2006/2007)에서 예외를 통한 스레드 취소는 오랫동안 논의되었습니다. 쓰레드 취소를 지원하는 것이 이상한 문제를 일으키고 C++에서 쓰레드 취소를 지원하기에 너무 많은 질문이 열려 있다는 결론이났습니다. C++에서 작업 스레드 캔 캐롤 지원을 원하면 C++ 표준과 통합해야합니다. C++에서 스레드 취소에 대한 대규모 지원은 기대하지 않습니다.

예를 들어, read(2)에서 던지는 것은 모호한 I/O 스트림 구현의 스트림을 일관성없는 상태로 남겨 둘 수 있다고 생각할 수도 있습니다. 시스템 기능은 던지기 위해 사용되지 않았습니다. 그렇게 재미있는 일을 시작하면 일어날 수 있습니다. 즉 stabdard 라이브러리는 시스템 호출 동작에 대한이 변경을 인식해야합니다. 이 동작의 자동 변경은 예외를 통한 스레드 취소가 실행 가능한 접근 방식으로 간주되지 않는 이유 중 하나였습니다. 표준 C++ 라이브러리 구현에 적용되는 것은 사용자 코드에 더 많이 적용됩니다.

+0

감사합니다. 내가 사용하는 C++ 코드의 어떤 부분도 처리하지 않을 것이다. –