gpt4 book ai didi

c - Linux 系统克隆。释放堆栈内存

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:00 25 4
gpt4 key购买 nike

我正在尝试使用 clone() 系统调用来实现 pthread_create 的一个版本。我很好奇 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);
}

此方法不起作用,因为进程在 HandleThread 中的 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 库的内部结构,很想听听。谢谢。

最佳答案

您没有释放刚刚创建的线程中的堆栈。父进程,即您的主线程拥有堆栈,并在线程返回时释放堆栈。

手册页有一个使用克隆的示例,包括正确创建堆栈。

http://linux.die.net/man/2/clone

您需要设置一个数据结构来跟踪线程及其堆栈,这样当您测试 child 是否还活着或收到它已死的信号时,您可以进行清理。

关于c - Linux 系统克隆。释放堆栈内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36614490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com