我有一个问题。在linux C编程中,如果我们使用pthread创建一个线程,我们可以通过pthread_self()
得到它的tid。
有没有办法简单地获取该线程的基址(使用pthread中的一些API)?
谢谢!
答案 0 :(得分:0)
正确的方法是使用pthread_getaddr_np
(不一定是可移植的,似乎可以与glibc和musl一起使用)和pthread_attr_getstack
#define _GNU_SOURCE //for pthread_getattr_np
#include <pthread.h>
void* thread_main(void* args) {
//your code here
}
int main() {
pthread_t thread;
pthread_create(&thread, NULL, &thread_main, NULL);
pthread_attr_t attrs;
pthread_getattr_np(thread, &attrs);
void* stack_ptr;
size_t stack_size;
pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
//`stack_ptr` now points to the base address of the spawned thread's stack
...
}
如果您尝试避免调用pthread_getaddr_np
,则可能会得到意外的结果。如果您使用堆栈地址的dafault值,pthread_create()
将忽略它,并选择一个合适的堆栈地址(在linux,gnu libc和musl libc上)。
#define _GNU_SOURCE //for pthread_getattr_np
#include <pthread.h>
#include <stdio.h>
void* thread_main(void* args) {
//your code here
return NULL;
}
int main() {
pthread_t thread;
pthread_attr_t attrs;
pthread_attr_init(&attrs);
void* stack_ptr;
size_t stack_size;
pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
printf("default stack address:\t%x\n", stack_ptr);
pthread_create(&thread, &attrs, &thread_main, NULL);
pthread_getattr_np(thread, &attrs);
pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
//`stack_ptr` now points to the base address of the spawned thread's stack
printf("real stack address:\t%x\n", stack_ptr);
return 0;
}
输出:
default stack address: 0
real stack address: d385a000
答案 1 :(得分:-1)
是0x00000000
。令人惊讶..