2010-12-28 5 views
14

단일 스레드의 실행을 추적하기 쉽도록 로깅 할 때 간단한 ID로 스레드를 식별 할 수 있기를 원합니다. API를 사용하는 Windows에서 GetCurrentThreadId()은 내가 원하는 것을 얻을 수 있습니다. boost::thread에는 메소드 get_id()이 있지만 정수와 같은 정수 값을 나타내지는 않습니다. 이 객체에는 원하는 것처럼 보이지만 데이터 멤버는 private이므로 액세스 할 수없는 id가 포함 된 thread_data 멤버가 있습니다.부스트 :: 스레드에서 스레드 ID를 검색하는 방법?

표시 또는 식별을 위해 스레드 ID에 액세스하는 부스트 방법은 무엇입니까?

답변

9

부스트는 스레드 ID를 스트림에 쓰는 데 사용할 수있는 오버로드를 포함합니다 (실제로 오버로드는 템플릿이며 std::ostream이 아닌 std::basic_ostream의 특수화에서 작동합니다).

다른 플랫폼에서 스레드 식별자에 대해 다른 내부 표현을 사용할 수 있으므로 id를 인쇄 한 결과는 플랫폼별로 다를 수 있습니다.

+0

그래서 함수에 매개 변수로 출력 스트림 연산자와 함께 사용되는 boost :: thread :: id를 전달하겠습니까? 스트림이나 스트림 연산자없이 값을 사용할 수있게하려면 무엇을 제외하고는 거의 소리가 나지 않습니까? – AJG85

+0

boost :: this_thread :: get_id()를 스레드 작업자 함수 내에서 사용하면 실제로 sprintf_s 스타일을 사용하여 매개 변수를 지정하지 않아도됩니다. – AJG85

8

회원 기능 boost::thread::native_handle()을 사용해야합니다. 네이티브 thread 식별자의 구현으로 정의 된 별명 인 타입 native_handle_type를 돌려줍니다.이 고유 식별자는 네이티브 thread API 함수로 사용할 수 있습니다.

boost::this_thread::get_id() 

이 방법은 부스트에서 내부 ID 유형을 반환 : 당신은 단순히 다음과 같은 메서드를 호출 말했듯이

+0

내가 필요한 모든 것을 아는 데 유용하지만 스레드 ID가 있습니다. boost :: thread를 사용하는 주된 이유는 제 경우에 OS 특정 호출을 피하기 위해서입니다. – AJG85

+3

@ AJG85 : ... 그리고'nativehandle()'은 당신에게 똑같은 고유 한 식별자를 제공 할 것이므로 문제가 무엇입니까? 다른 용도로 사용할 필요는 없습니다. 그것은 단순히 가치가 나타내는 것을 설명하는 것이 었습니다. 사실 GetCurrentThreadId()에서 얻을 수있는 것은 정확히 * 정확합니다. 중요하게도이 식별자는 디버거의 * threads * 창에 표시된 식별자와 동일하므로 해당 값을 알고 있으면 멀티 스레드 디버깅에 도움이 될 수 있습니다. – Clifford

+0

좋은 지적. 네이티브 호출에 사용될 수 있다고해서 그것이 그 유일한 것임을 의미하지는 않습니다. 또한 GetCurrentThreadId()에 의해 반환 된 정수 ID와 반대로 GetCurrentThread()에서 얻을 수있는 핸들과 동일하다고 생각합니다. – AJG85

39

너무 늦었지만는 대답을 찾고있는 사용자를 위해, 부스트는 스레드 ID를 참조 할 수 있습니다 원하는 숫자가 아닙니다. 그러나이 숫자를 예를 들어 unsigned long으로 쉽게 변환 할 수 있습니다. id는 16 진수 표현으로되어 있습니다. 이 작은 기능은 드 작업을 수행합니다

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

이 boost_thread와 boost_system와 링크를 잊지 마세요 :

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

이 이런 식으로 뭔가를 반환합니다.

희망이 도움이됩니다.

+0

+1 감사합니다.이게 내가 찾고 있었던 것입니다! – Avio

+0

스레드 개체에서 ID를 가져 오는 방법은 무엇입니까? ('boost :: thread mythread') –

관련 문제