多线程环境下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
相关产品推荐
相关产品推荐

