Bagaimana cara mengambil id utas dari boost::thread?

Saya ingin dapat mengidentifikasi utas dengan id sederhana saat masuk sehingga mudah untuk melacak eksekusi satu utas. Dengan windows menggunakan API GetCurrentThreadId() dapat mencapai apa yang saya inginkan. Di boost::thread ada metode get_id() tetapi ini tidak mewakili nilai integral seperti bilangan bulat. Objek ini memang memiliki anggota thread_data yang berisi id yang sepertinya saya inginkan tetapi anggota data tersebut bersifat pribadi sehingga tidak dapat diakses.

Apa cara tambahan untuk mengakses id thread untuk tujuan tampilan atau identifikasi?


person AJG85    schedule 28.12.2010    source sumber


Jawaban (3)


Boost menyertakan kelebihan operator<<(std::ostream&, const boost::thread::id&) yang dapat digunakan untuk menulis id thread ke aliran (sebenarnya, kelebihan tersebut adalah templat dan akan bekerja dengan spesialisasi std::basic_ostream apa pun, bukan hanya std::ostream).

Hasil pencetakan id kemungkinan besar spesifik untuk platform, karena platform yang berbeda mungkin menggunakan representasi internal yang berbeda untuk pengidentifikasi thread.

person James McNellis    schedule 28.12.2010
comment
jadi sebagai parameter ke suatu fungsi saya akan meneruskan boost::thread::id untuk digunakan dengan operator aliran keluaran? Kedengarannya hampir sama, kecuali bagaimana jika Anda ingin nilainya dapat digunakan tanpa aliran atau operator aliran? - person AJG85; 28.12.2010
comment
menggunakan boost::this_thread::get_id() dari dalam fungsi pekerja thread sebenarnya berfungsi dengan format gaya sprintf_s tanpa memerlukan parameter. - person AJG85; 29.12.2010

Terlambat, tetapi bagi pengguna yang mencari jawaban, boost memungkinkan untuk melihat id thread seperti yang Anda katakan, cukup panggil metode berikut:

boost::this_thread::get_id()

Metode ini mengembalikan tipe id internal dari boost, yang bukan numerik seperti yang Anda inginkan. Namun Anda dapat dengan mudah mengonversi angka ini menjadi, misalnya, unsigned long dengan mempertimbangkan bahwa id memiliki representasi heksadesimal. Fungsi kecil ini akan berfungsi 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;
}

Ini akan mengembalikan sesuatu seperti ini:

4491075584
4491612160
4492148736
4492685312
4493221888
4493758464
4494295040
4494831616
4495368192
4495904768

Jangan lupa link dengan boost_thread dan boost_system.

Semoga ini membantu!

person Alvaro Luis Bustamante    schedule 20.06.2013
comment
Bagaimana cara mengambil ID dari objek thread? (boost::thread mythread) - person Tomáš Zato - Reinstate Monica; 23.10.2015

Anda perlu menggunakan fungsi anggota boost::thread::native_handle(). Ia mengembalikan tipe native_handle_type yang merupakan alias yang ditentukan implementasi untuk pengidentifikasi thread asli, yang kemudian dapat digunakan dengan fungsi API thread asli.

person Clifford    schedule 28.12.2010
comment
Meskipun berguna untuk mengetahui yang saya butuhkan hanyalah id utas. Alasan utama menggunakan boost::thread adalah untuk menghindari panggilan khusus OS dalam kasus saya. - person AJG85; 28.12.2010
comment
@AJG85: ... dan nativehandle() akan memberi Anda persis pengidentifikasi unik seperti itu, jadi apa masalahnya? Anda tidak perlu menggunakannya untuk hal lain; itu hanyalah penjelasan tentang apa yang diwakili oleh nilai; ini sebenarnya persis yang akan Anda dapatkan dari GetCurrentThreadId(). Yang penting pengenal ini akan sama dengan yang ditampilkan di jendela threads debugger, jadi mengetahui nilainya dapat membantu proses debug multi-thread. - person Clifford; 29.12.2010
comment
Poin bagus. Hanya karena dapat digunakan untuk panggilan asli bukan berarti hanya itu gunanya. Saya juga yakin ini setara dengan pegangan yang akan Anda dapatkan dari GetCurrentThread() sebagai lawan dari id integer yang dikembalikan oleh GetCurrentThreadId(). - person AJG85; 29.12.2010
comment
Terima kasih untuk ini; mungkin bukan jawaban terbaik untuk pertanyaan yang diposting, tapi itu membantu saya =] - person taxilian; 31.05.2012