จะดึงรหัสเธรดจาก boost :: thread ได้อย่างไร

ฉันต้องการที่จะระบุเธรดด้วย id แบบง่ายเมื่อทำการบันทึก เพื่อให้ง่ายต่อการติดตามการดำเนินการของเธรดเดียว ด้วย windows ที่ใช้ API GetCurrentThreadId() สามารถบรรลุสิ่งที่ฉันต้องการได้ ใน boost::thread มีวิธี get_id() แต่ไม่ได้แสดงถึงค่าจำนวนเต็มเหมือนจำนวนเต็ม วัตถุนี้มีสมาชิก thread_data ซึ่งมีรหัสซึ่งดูเหมือนว่าจะเป็นสิ่งที่ฉันต้องการ แต่สมาชิกข้อมูลเป็นแบบส่วนตัวดังนั้นจึงไม่สามารถเข้าถึงได้

วิธีเพิ่มประสิทธิภาพในการเข้าถึงรหัสเธรดเพื่อการแสดงผลหรือการระบุตัวตนคืออะไร?


person AJG85    schedule 28.12.2010    source แหล่งที่มา


คำตอบ (3)


Boost มีการโอเวอร์โหลด operator<<(std::ostream&, const boost::thread::id&) ที่สามารถใช้เพื่อเขียนรหัสเธรดไปยังสตรีม (จริงๆ แล้ว การโอเวอร์โหลดเป็นเทมเพลตและจะทำงานกับความเชี่ยวชาญพิเศษใดๆ ของ std::basic_ostream ไม่ใช่แค่ std::ostream)

ผลลัพธ์ของการพิมพ์ id มีแนวโน้มเฉพาะแพลตฟอร์ม เนื่องจากแพลตฟอร์มที่แตกต่างกันอาจใช้การแสดงภายในที่แตกต่างกันสำหรับตัวระบุเธรด

person James McNellis    schedule 28.12.2010
comment
ดังนั้นในฐานะพารามิเตอร์ของฟังก์ชันฉันจะผ่านการ boost::thread::id เพื่อใช้กับตัวดำเนินการสตรีมเอาต์พุต ฟังดูใกล้เคียงกัน ยกเว้นว่าถ้าคุณต้องการให้ค่าใช้งานได้โดยไม่มีสตรีมหรือตัวดำเนินการสตรีมล่ะ - person AJG85; 28.12.2010
comment
การใช้ boost::this_thread::get_id() จากภายในฟังก์ชันตัวทำงานของเธรดใช้งานได้จริงด้วยการจัดรูปแบบสไตล์ sprintf_s โดยไม่จำเป็นต้องใช้พารามิเตอร์ - person AJG85; 29.12.2010

สายเกินไป แต่สำหรับผู้ใช้ที่กำลังมองหาคำตอบ boost อนุญาตให้ดูรหัสเธรดตามที่คุณพูด เพียงเรียกใช้วิธีการต่อไปนี้:

boost::this_thread::get_id()

เมธอดนี้ส่งคืนประเภท id ภายในจากการบูสต์ ซึ่งไม่ใช่ตัวเลขตามที่คุณต้องการ แต่คุณสามารถแปลงตัวเลขนี้เป็นค่ายาวที่ไม่ได้ลงนามได้อย่างง่ายดาย โดยคำนึงถึงว่า id มีการแสดงในรูปแบบเลขฐานสิบหก ฟังก์ชันเล็กๆ น้อยๆ นี้จะช่วยการทำงานของ 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;
}

สิ่งนี้จะส่งคืนสิ่งนี้:

4491075584
4491612160
4492148736
4492685312
4493221888
4493758464
4494295040
4494831616
4495368192
4495904768

อย่าลืมลิงค์กับ boost_thread และ boost_system

หวังว่านี่จะช่วยได้!

person Alvaro Luis Bustamante    schedule 20.06.2013
comment
ฉันจะดึง ID จากวัตถุเธรดได้อย่างไร (boost::thread mythread) - person Tomáš Zato - Reinstate Monica; 23.10.2015

คุณต้องใช้ฟังก์ชันสมาชิก boost::thread::native_handle() โดยส่งคืนประเภท native_handle_type ซึ่งเป็นนามแฝงที่กำหนดการใช้งานสำหรับตัวระบุเธรดดั้งเดิม ซึ่งสามารถใช้กับฟังก์ชัน API เธรดดั้งเดิมได้

person Clifford    schedule 28.12.2010
comment
แม้ว่าฉันจะมีประโยชน์ในการรู้ แต่สิ่งที่ฉันต้องการก็คือรหัสเธรด เหตุผลหลักในการใช้ boost::thread คือเพื่อหลีกเลี่ยงการโทรเฉพาะระบบปฏิบัติการในกรณีของฉัน - person AJG85; 28.12.2010
comment
@ AJG85: ... และ nativehandle() จะให้ตัวระบุที่ไม่ซ้ำกัน ทุกประการ แก่คุณ ดังนั้นปัญหาคืออะไร คุณไม่จำเป็นต้องใช้มันเพื่อสิ่งอื่นใด นั่นเป็นเพียงการอธิบายว่าคุณค่านั้นหมายถึงอะไร จริงๆ แล้วมันคือ อย่างแน่นอน สิ่งที่คุณจะได้รับจาก GetCurrentThreadId() ที่สำคัญ ตัวระบุนี้จะเหมือนกับที่แสดงในหน้าต่าง threads ของดีบักเกอร์ ดังนั้นการทราบค่าของมันอาจช่วยในการดีบักแบบมัลติเธรดได้ - person Clifford; 29.12.2010
comment
จุดดี. เพียงเพราะสามารถใช้สำหรับการโทรแบบเนทีฟไม่ได้หมายความว่ามีไว้เพื่อการโทรนั้นเพียงอย่างเดียว นอกจากนี้ฉันเชื่อว่ามันเทียบเท่ากับหมายเลขอ้างอิงที่คุณจะได้รับจาก GetCurrentThread() ซึ่งตรงข้ามกับรหัสจำนวนเต็มที่ส่งคืนโดย GetCurrentThreadId() - person AJG85; 29.12.2010
comment
ขอบคุณสำหรับสิ่งนี้; อาจไม่ใช่คำตอบที่ดีที่สุดสำหรับคำถามที่โพสต์ แต่มันช่วยฉันได้ =] - person taxilian; 31.05.2012