最近在解决tvm绑核问题时,发现android下绑核只有sched_setaffinity
函数,这导致无法使用标准库中的td::thread::native_handle_type thread
进行绑核操作。虽然在ndk 21以上的版本提供了pthread_gettid_np
函数获取线程相应的pid,但在较低版本中,还是没办法直接使用。
看下ndk 中 std 标准库上thread 的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 class _LIBCPP_TYPE_VIS thread{ __libcpp_thread_t __t_; ... public : typedef __thread_id id; typedef __libcpp_thread_t native_handle_type; ... }; typedef pthread_t __libcpp_thread_t ;typedef long pthread_t ;
上面可以看出,在ndk的实现中native_handle_type
等价于pthread_t
, 再根据pthread_gettid_np
的实现,可以发现 ,pthread_t
其实就是pthread_internal_t
的地址。在pthread_internal_t
中保存了线程的tid
1 2 3 4 5 6 7 8 9 10 11 pid_t pthread_gettid_np (pthread_t t) {return __pthread_internal_gettid(t, "pthread_gettid_np" );} pid_t __pthread_internal_gettid(pthread_t thread_id, const char * caller) {pthread_internal_t * thread = __pthread_internal_find(thread_id, caller);return thread ? thread->tid : -1 ;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 typedef struct pthread_internal_t { struct pthread_internal_t * next;struct pthread_internal_t * prev;pthread_attr_t attr;pid_t tid;bool allocated_on_heap;pthread_cond_t join_cond;int join_count;void * return_value;int internal_flags;__pthread_cleanup_t * cleanup_stack;void ** tls; #define __BIONIC_DLERROR_BUFFER_SIZE 512 char dlerror_buffer[__BIONIC_DLERROR_BUFFER_SIZE];} pthread_internal_t ;
本文标题: ndk std_thread 获取pid
文章作者: 王二
发布时间: 2023-09-09
最后更新: 2024-11-06
原始链接: https://wanger-sjtu.github.io/ndk-pid/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!