Mendapatkan id utas panggilan metode saat ini

122

Apakah ada cara untuk mencetak id utas saat ini di mana metode saat ini sedang dijalankan?

(mohon obyektif-c)

Alexi Groove
sumber
3
nall menjawab pertanyaan, tapi bukan pertanyaan sebenarnya .... kenapa kamu ingin tahu? Selain men-debug atau menyatakan perilaku yang benar, hal-hal dasar di currentThread umumnya merupakan ide yang buruk.
bbum
I untuk satu membutuhkannya untuk membuat objek thread-lokal yang dilampirkan ke objek lain (yaitu terkait ke objek induk dan thread - bukan hanya thread).
adib

Jawaban:

229
NSLog(@"%@", [NSThread currentThread]);
nall
sumber
Apa arti nama = (null), jika utas utama mengembalikan NSThread: 0x60800006cb80> {number = 1, name = main}, Apakah itu berarti "nama = (null)" mengacu pada utas latar belakang.
Nirmala Maurya
Dan bagaimana seseorang mengambil nama dan nomor itu? namemengembalikan deskripsi kosong bahkan untuk utama dan numbertidak bisa ditemukan
Hari Karam Singh
Nomor benang cepat dan kotor:NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum);
Hari Karam Singh
35
#include <pthread.h>
...
mach_port_t machTID = pthread_mach_thread_np(pthread_self());
NSLog(@"current thread: %x", machTID);
neoneye
sumber
4
@ Rajneesh071 Memang, apa lagi yang Anda harapkan, menampilkan ID utas yang berbeda?
arti-penting
The [NSThread currentThread]metode kelas mengembalikan sebuah objek NSThread. Anda dapat mencatat alamat objek utas itu, tetapi bagaimana cara mendapatkan ID utas numerik, seperti yang ditampilkan di debugger Xcode? (Utas 1 untuk utas utama, dan bertambahnya angka untuk setiap utas tambahan yang dibuat oleh aplikasi Anda.)
Duncan C
@ Duncan: Itu hampir pasti merupakan fitur debugger, bukan OS / runtime.
Cameron
25

Di Swift 5

print("Current thread \(Thread.current)")
dimo hamdy
sumber
12

Di Swift

print("Current thread \(NSThread.currentThread())")
Glauco Neves
sumber
3

Di Swift4

print ("\ (Thread.current)")

Jason
sumber
-1

Anda dapat meretas sesuatu seperti ini (ini hanya tercetak cantik, tetapi Anda dapat melanjutkan dan membaginya sampai Anda mendapatkan nomornya):

+ (NSString *)getPrettyCurrentThreadDescription {
    NSString *raw = [NSString stringWithFormat:@"%@", [NSThread currentThread]];

    NSArray *firstSplit = [raw componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"{"]];
    if ([firstSplit count] > 1) {
        NSArray *secondSplit     = [firstSplit[1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"}"]];
        if ([secondSplit count] > 0) {
            NSString *numberAndName = secondSplit[0];
            return numberAndName;
        }
    }

    return raw;
}
Ahli
sumber