2011-02-09 4 views
1

스레드가 현재 블로킹 중인지 여부를 확인하는 방법을 알고있는 사람이 있습니까? 기본적으로, 특정 스레드가 (이 경우에는 AF_UNIX 데이터 그램 소켓 수신 호출에서) 블로킹하는지 확인하고 인터럽트 신호가 있으면이를 보내려고합니다.스레드 차단 여부 결정

저는 리눅스에서 Boost.Thread의 의미를 사용하고 있습니다. 아래의 의미는 pthreads입니다. 내 시스템에 NPTL이 있습니다.

나는 대답이 "아니오"라고 생각하지만 뭔가를 놓치고 있는지 알고 싶습니다.

+0

이미 Boost :: Thread를 사용하고 있다면 Boost :: asio를 사용하여 읽지 않으시겠습니까? – Max

+0

내가 아는 한, Boost.Asio는 내 문제를 해결하지 못합니다. 스레드가 현재 블로킹 중인지 여부를 판단 할 수 있어야합니다. Boost.Asio는 일반적으로 유용하지만이 문제를 해결하지 못합니다. – deuberger

답변

2

이것은 쉽게 불가능합니다 (디버거를위한 기능을 사용하는 것이 가능하지만 단순하지만 휴대 가능하거나 안전하지 않습니다).

어쨌든 이러한 사용에는 본질적인 경쟁 조건이 있기 때문에 실제로이 작업을 수행하고 싶지는 않습니다. 스레드가 차단되기 직전에 스레드가 차단되고 있는지 여부를 확인할 수 있습니다 (이 경우 깨우지 못할 수도 있습니다). 또는 스레드가 차단되고 있음을 발견 한 후 차단을 중지 할 수 있습니다. 문제를 해결하기

일반적인 방법은 "자기 파이프 트릭"입니다 :

  • pipe()와 파이프를 만들기;
  • 대상 스레드는 recvfrom()을 차단하는 대신 poll() 또는 select() 블록을 차단합니다. 모니터 할 파일 디스크립터에는 데이터 그램 소켓과 파이프의 읽기 끝이 포함됩니다.
  • 대상 스레드를 깨우려면 다른 스레드가 파이프의 쓰기 끝 부분에 단일 바이트를 씁니다.

는합니다 (recvfrom()는 대신 poll()/select()에 차단 항상 우리가 여기에 차단하고 싶지는 않을 때문에, MSG_DONTWAIT 플래그를 사용하고 변경해야합니다).

0

대답은 '아니오'입니다. 플랫폼에서이 작업을 수행 할 수있는 방법이 있지만 일반적으로이 작업을 수행 할 방법이 없습니다.

스레드는 항상 이유가 차단됩니다 : 당신은 당신의 플랫폼의 낮은 수준의 문서에 뛰어 전에

지금이 당신이 원하는 정말 경우 두 번 생각합니다. 예를 들어 FILE IO에서 차단 될 수 있습니다. 반환 값을 올바르게 처리하면 안전하게 중단 될 수 있습니다. 반면 스레드는 새/삭제 호출 또는 다른 표준 라이브러리 함수 내에서 차단 될 수 있습니다. 런타임 라이브러리 내의 스레드를 인터럽트하는 것은 재해에 대한 영수증입니다.

여기에서 물어볼 이유가 있지만 imho는 더 높은 수준의 관점에서 문제를 생각하고 해킹없이 목표에 도달 할 수 있도록 디자인을 수정하는 것이 좋습니다.

+0

좋은 점 ... 감사 ... 부스트에서 이것을 수행 할 방법이 없다는 것을 말하고 있습니까? 스레드 또는 pthreads/NPTL에서도 수행 할 수 없습니까? 나는 그것이 사실이라고 생각한다. 그래서 나는 내가하고 싶은 것 같지 않은 더 낮은 수준으로 되돌려 놓아야 할 것이다. – deuberger