【发布时间】:2016-08-05 11:58:27
【问题描述】:
我正在尝试使用clone() 系统调用来实现pthread_create 的版本。我很好奇线程退出后pthread free 的堆栈内存如何。这是我尝试过的:
struct ThreadInfo{...}
void ThreadPrint(){...}
void HandleThread(args){
ThreadInfo* info = (cast here)args;
info->callfunction;
free(info->stack)
}
void CreateThread(callfunction){
ThreadInfo info = {};
info.stack = //alloc stack
info.callfunction = callfunction;
clone(HandleThread,...,&info)
}
int main(){
CreateThread(ThreadPrint);
}
此方法不起作用,因为进程在HandleThread 中的free() 函数调用期间仍需要使用其堆栈。这可能是因为当堆栈被释放并且 free 不能再返回时,返回地址丢失了,所以也许使用原始系统调用可能会起作用。除此之外,我不确定如何在不使用单独进程的情况下释放线程堆栈。
编辑:对于那些感兴趣的人,这是我为让线程释放自己的堆栈而进行的系统调用。
__asm__ volatile (
"mov $11,%%rax\n" //call munmap
"mov %[addr],%%rdi\n"
"mov %[len],%%rsi\n"
"syscall\n"
"xor %%rdi,%%rdi\n"
"mov $60,%%rax\n"//manually call exit
"syscall\n":: [addr] "g" (info->stack), [len] "g" (info->stacksize)
);
据我所知,您必须使用内联汇编。使用 C 函数包装器将使线程无处可返回。如果有人有更好的解决方案,我很想听听。更好的是,如果有人知道 pthread 库的内部结构,很想听听。谢谢。
【问题讨论】:
标签: c linux multithreading clone