2011-09-22 3 views
1

여기 상황이 있습니다. 스레드가 실행 중이며 소유하지 않은 코드로 부분적으로 제어됩니다. 내가 스레드 ID를 가지고 있도록 스레드를 시작했지만 다른 코드로 전달했습니다. 나는 다른 코드가 현재 내가 제어 할 수있는 다른 스레드에서 스레드를 차단하도록했는지 알 수 있어야합니다. pthreads에서이 작업을 수행 할 수있는 방법이 있습니까? Java의 Thread 클래스 (http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState())의 getState() 메소드와 동일한 것을 찾고 있다고 생각합니다. .pthread 스레드가 블로킹되어 있는지 확인하십시오.

-------------- 편집 -----------------

솔루션은 플랫폼에 의존하는 경우가 괜찮습니다. 나는 이미/proc 파일 시스템을 사용하여 리눅스 용 솔루션을 발견했다.

+0

실제로 달성하려는 것은 무엇입니까? 자바를 모방하려는 것보다 다른/더 좋은 방법이있을 수 있습니다. – Duck

+1

이것은 테스트 프레임 워크 용입니다. 우리는 사람들이 명시 적으로 정의 된 스레드 스케줄 하에서 재진입 코드를 테스트 할 수 있도록 쓰레드 스케줄을 제어하려고합니다. –

답변

2

원래 함수를 호출하기 전/후에 일부 상태 정보를 간단히 업데이트하는 일부 pthreads 함수에 대한 래퍼를 작성할 수 있습니다. 이렇게하면 뮤텍스 (및 어떤 뮤텍스)를 획득하거나 보유 할 때 실행중인 스레드를 추적하고 조건 변수를 기다리는 시간 등을 추적 할 수 있습니다.

물론 이것은 pthreads 동기화 객체에서 차단되었을 때만 알려주며 다른 것들을 차단할 때 알려주지 않습니다.

+0

이것은 정말 좋은 일이고 아마도 이런 식으로 일할 것입니다. 그들이 I/O와 같은 다른 것을 막고 있는지 알아낼 방법이 있다고 생각합니까? –

+0

나는 그 일을하는 방법이 그들이 차단하고있는 것에 달려 있다고 생각합니다. 그들이 pthreads에서 차단되지 않고 비활성 상태라고 말할 수 있다면, 다른 것을 기다리는 중이라고 말하는 것이 안전 할 수 있습니다. 그러나 무엇이 복잡한 지 알아내는 것은 어려울 수 있습니다.나는 그것을 충분히 들여다 보지 못했지만 확실히 말할 수는있다. – Dmitri

-1

다른 코드로 스레드를 전달하기 전에 뮤텍스로 보호되는 플래그를 설정하십시오. 스레드가 제어하지 않는 코드에서 돌아 오면 뮤텍스로 보호 된 플래그를 지 웁니다. 그런 다음 필요에 따라 스레드가 제어하지 않는 코드에 있는지 여부를 확인할 수 있습니다.

코드 외부에서 차단 된 블록과 차단되지 않은 블록은 구분되어 있지 않습니다. 글자의 상태를 문자 그대로 확인했다면 무의미한 결과를 얻게됩니다.

예를 들어 두 개의 라이브러리 구현을 고려해보십시오.

A : 우리는 모든 작업을 호출 스레드에서 수행합니다.

B : 작업을 수행하기 위해 작업자 스레드를 발송합니다. 작업 스레드가 완료 될 때까지 호출 스레드가 차단됩니다.

두 경우 모두 제어하지 않는 코드는 똑같이 앞으로 진행됩니다. 귀하의 '말쑥한'생각은 다른 결과를 제공 할 것입니다. 그래서 당신이 원하는 것이 아닙니다.

+0

스레드 상태 (블록 또는 차단 해제)가 변경되기 전에 변경 될 수 있기 때문에 작동하지 않습니다. –

+0

물론, 왜 신경을 썼겠습니까? 작업이 1 분 후에 계속 진행되고 있는지 확인하려면 (아마 취소하거나 계속 진행하기로 결정할 것입니다.) 확인한 후 1 초가 끝나는 지 신경 쓰지 마십시오. 일단 충분한 시간이 경과했는지를 결정하고 그것이 여전히 진행되고 있다고 판단되면, 포기할 것을 돌이킬 수없는 결정을 내려야합니다. 당신은 당신이 물었던 '주저 앉다'와 같은 상황이 될 것입니다. –

+0

왜 내가 신경 써야할까요, 원래 질문에 대해 작성한 의견을보십시오. –

관련 문제