You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程环境下C语言自定义debug打印函数testPrint的运行时内存需求

问题解答

先贴出你提供的代码:

int run = 1;
int testPrint(char *format, ...)
{
    va_list aptr;
    int ret;
    char buffer[1024];
    
    va_start(aptr, format);
    ret = vsprintf(buffer, format, aptr);
    va_end(aptr);
    //do something pass(&buffer);
    
    return(ret);
}

void fooThread(void *argv)
{
    while(run)
    {
        testPrint("%s %d\n",__function__ ,__LINE__ );
    }
}


int main(){
    
    for (int i = 0; i < 100; i++){

        pthread_t t;
        pthread_create(&t,NULL,fooThread,NULL);
        pthread_detach(&t);
    }
    return 0;
}

你的问题答案是:既不是固定1024字节,也不是固定1024×100字节,实际占用内存是1024字节 × 当前正在执行testPrint函数的线程数量。

原因如下:

  • testPrint里的buffer[1024]是局部自动变量,存储在调用该函数的线程的栈空间中。
  • 每个线程拥有独立的栈,当线程进入testPrint时,会在自己的栈上分配这1024字节的缓冲区;函数执行完毕返回后,这块栈空间会被线程的栈回收复用。
  • 你创建了100个线程,但这些线程不会一直卡在testPrint里——线程调度会让它们轮流执行,或者有的线程可能在循环的while(run)判断环节等待。只有那些刚好执行到testPrint内部的线程,才会占用各自的1024字节缓冲区。
  • 极端情况下,如果操作系统调度让100个线程同时进入testPrint函数执行,那此时总占用就是1024×100字节,但这种情况很少见。

内容的提问来源于stack exchange,提问作者tw kingofsd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:36:22