Mac/iPhone: Is there a way to get a thread identifier without using Objective-C?

前端 未结 4 1315
南旧
南旧 2021-02-02 16:40

Is there a way to get any kind of thread identifier of the currently running thread without resorting to Objective-C\'s NSThread.

I\'m improving our custom debug tracing

4条回答
  •  既然无缘
    2021-02-02 16:43

    One disadvantage of using a Mach port name to identify a thread is that the name returned is local to the calling process. If several tasks retrieve a particular task's threads (using task_threads), each task will retrieve a different port name for a particular thread.

    On OS X, you can retrieve a unique 64-bit identifier using thread_info. This identifier is global (it is the same for a given thread, no matter which task is querying it) and unique (no other thread will ever have the same ID, now or in the future, until after reboot of course - as a 64-bit value, overflow is unlikely).

    (See XNU source, XNU source.)

    Retrieve this identifier for a pthread using code along these lines:

    uint64_t GetThreadID(pthread_t thread) {
        mach_port_name_t port=pthread_mach_thread_np(thread);
    
        thread_identifier_info_data_t info;
        mach_msg_type_number_t info_count=THREAD_IDENTIFIER_INFO_COUNT;
        kern_return_t kr=thread_info(thread,
                                     THREAD_IDENTIFIER_INFO,
                                     (thread_info_t)&info,
                                     &info_count);
        if(kr!=KERN_SUCCESS) {
            /* you can get a description of the error by calling
             * mach_error_string(kr)
             */
            return 0;
        } else {
            return info.thread_id;
        }
    }
    

    (See XNU source.)

    Two notes:

    1. There's no documentation for THREAD_IDENTIFIER_INFO, or at least none that I've been able to find. So I suppose, strictly speaking, that makes it undocumented. But it's in the public headers, right next to THREAD_BASIC_INFO, which is documented - so I'm assuming this is simply an oversight. It's not like the documentation for any of this stuff is particularly great.)

    2. I don't know what the situation is on iOS, but THREAD_IDENTIFIER_INFO and pthread_mach_thread_np both appear to be available in the headers, so it could be worth a try.

提交回复
热议问题