2010-12-28 29 views
14

Tôi muốn có thể xác định chủ đề bằng một id đơn giản khi đăng nhập để dễ dàng theo dõi việc thực hiện một chuỗi đơn lẻ. Với các cửa sổ sử dụng API GetCurrentThreadId() có thể đạt được những gì tôi muốn. Trong boost::thread có một phương thức get_id() nhưng điều này không đại diện cho một giá trị tích phân như một số nguyên. Đối tượng này không có một thành viên thread_data chứa một id mà có vẻ là những gì tôi muốn nhưng thành viên dữ liệu là riêng tư nên không thể truy cập được.Làm thế nào để lấy id chủ đề từ một tăng :: thread?

Cách tăng cường để truy cập id luồng cho mục đích hiển thị hoặc nhận dạng là gì?

Trả lời

9

Tăng bao gồm quá tải operator<<(std::ostream&, const boost::thread::id&) có thể được sử dụng để ghi id luồng vào luồng (thực sự, quá tải là mẫu và sẽ hoạt động với bất kỳ chuyên môn nào của std::basic_ostream, không chỉ std::ostream).

Kết quả của việc in id có thể là nền tảng cụ thể, vì các nền tảng khác nhau có thể sử dụng các biểu diễn nội bộ khác nhau cho số nhận dạng chuỗi.

+0

để tham số cho một hàm, tôi sẽ chuyển boost :: thread :: id được sử dụng với toán tử luồng đầu ra? Điều này nghe có vẻ gần trừ nếu bạn muốn giá trị có thể sử dụng được nếu không có luồng hoặc nhà khai thác luồng? – AJG85

+0

bằng cách sử dụng tăng :: this_thread :: get_id() từ bên trong các công việc chủ đề chức năng thực sự làm việc ra với định dạng phong cách sprintf_s không có tham số cần thiết. – AJG85

8

Bạn cần sử dụng chức năng thành viên boost::thread::native_handle(). Nó trả về một loại native_handle_type là một bí danh được thực hiện được xác định cho một định danh chuỗi gốc, sau đó có thể được sử dụng với các hàm API chủ đề gốc.

+0

Mặc dù hữu ích khi biết tất cả những gì tôi cần là id luồng. Lý do chính để sử dụng boost :: thread là để tránh các cuộc gọi cụ thể của HĐH trong trường hợp của tôi. – AJG85

+3

@ AJG85: ... và 'nativehandle()' sẽ giúp bạn * chính xác * như một mã định danh duy nhất, vậy vấn đề là gì? Bạn không cần phải sử dụng nó cho bất cứ điều gì khác; đó chỉ đơn thuần là một lời giải thích về những gì giá trị đại diện; đó là thực tế * chính xác * những gì bạn sẽ nhận được từ 'GetCurrentThreadId()'. Quan trọng nhất định danh này sẽ giống như được hiển thị trong cửa sổ * threads * của trình gỡ rối, do đó, biết giá trị của nó có thể giúp gỡ lỗi nhiều luồng. – Clifford

+0

Điểm tốt. Chỉ vì nó có thể được sử dụng cho các cuộc gọi bản địa không có nghĩa đó là điều duy nhất nó được cho. Ngoài ra tôi tin rằng nó tương đương với xử lý bạn sẽ nhận được từ GetCurrentThread() như trái ngược với id số nguyên trả về bởi GetCurrentThreadId(). – AJG85

39

Quá trễ, nhưng đối với người dùng tìm kiếm một câu trả lời, tăng cho phép để tham khảo ý kiến ​​các thread id như bạn nói, chỉ cần gọi phương thức sau đây:

boost::this_thread::get_id() 

Phương pháp này trả về một kiểu id nội bộ từ tăng, mà không phải là số như bạn muốn. Nhưng bạn có thể dễ dàng chuyển đổi số này thành, ví dụ, một unsigned long đưa vào tài khoản mà id có dạng hệ thập lục phân. chức năng nhỏ này sẽ làm de Job:

#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; 
} 

này sẽ trở lại một cái gì đó như thế này:

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

Đừng quên liên kết với boost_thread và boost_system.

Hy vọng điều này sẽ hữu ích!

+0

+1 Cảm ơn bạn, đây là những gì tôi đang tìm kiếm! – Avio

+0

Làm cách nào để tìm nạp ID từ đối tượng chuỗi? ('boost :: thread mythread') –

Các vấn đề liên quan