我正在尝试使用pthread_create
系统调用来实现clone()
的版本。我很好奇在线程退出后如何pthread
释放的堆栈内存。这就是我的尝试:
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);
}
此方法不起作用,因为在free()
的{{1}}函数调用期间,进程仍需要使用其堆栈。这可能是因为当堆栈被释放时返回地址丢失并且free不再返回,因此可能使用原始系统调用可能有效。除此之外,我不知道如何在不使用单独进程的情况下释放线程的堆栈。
编辑:对于那些感兴趣的人,这是我让线程释放自己的堆栈的系统调用。
HandleThread
据我所知,您必须使用内联汇编。使用C函数包装将使线程无法返回。如果有人有更好的解决方案,我很乐意听到。更好的是,如果有人知道pthread库的内部,就会喜欢听到这个。感谢。
答案 0 :(得分:0)
您不会在刚刚创建的主题中释放堆栈。父进程,即你的主线程拥有堆栈,它会在线程返回时释放它。
手册页有一个使用克隆的示例,包括正确创建堆栈。
http://linux.die.net/man/2/clone
你需要设置一个跟踪线程及其堆栈的数据结构,这样当你测试孩子是否还活着或得到一个已经死亡的信号时你就可以清理了。
答案 1 :(得分:0)
管理线程堆栈由glibc完成。库使用mmap
分配线程堆栈,munmap
释放它们。
回想一下,线程可以连接或分离。
对于可连接线程,可以推迟释放其所有资源,直到调用pthread_join
为止。线程库可以在那时解除分配它的堆栈(或者将其标记为可以重复使用)。
当分离的线程终止时,即使没有通知库,它也会最终搜捕未使用的堆栈并将其回收。