php与python做网站,南京外贸网站建设怎么收费,和凡科网类似的网站,中国舆情网问题 1. local 变量的压栈和出栈过程 void func1(){     int a  0;     int b  0; } 系统中有一个栈顶指针#xff0c;每次分配和回收local 变量时#xff0c;其实就是移动栈指针。 2. static local变量的分配风险 void func2(){     static int a  0; } 这个变量a可能会被分…问题 1. local 变量的压栈和出栈过程 void func1(){     int a  0;     int b  0; } 系统中有一个栈顶指针每次分配和回收local 变量时其实就是移动栈指针。 2. static local变量的分配风险 void func2(){     static int a  0; } 这个变量a可能会被分配多次因为如果func2可能同时被多个线程调用也就是函数在分配内存时是可能出现线程切换的。问题 如 void func3(){ int a; int b; } void func4(){ int c; int d; } 假设func3和func4分别被两个线程调用并且func3先于func4执行并且4个变量压栈的顺序分别是a、b、c、d。按照上面第1个说明这个时候栈顶指针指向d。 如果这个时候func3先执行完那么这个时候系统要回收b和a但是b并不在栈顶所以无法移动栈顶指针所以b和a无法回收。最复杂的情况可能如下压栈的顺序是a、c、d、b这个时候b可以正常回收。当要回收a时会不会误把d当作a给回收了应该怎么解释这个问题呢。 显然事实上并非上面所述因为线程里有一个很重要的属性stacksize它让我们隐约感觉到线程是拥有私有的栈空间的如果这样abcd的压栈出栈就不会有问题了因为他们并不保存在一起。  pthread线程栈   #include stdio.h
#include pthread.hvoid* thread1(void* a)
{char m[8388608];printf(thread1\n);
}int main(){pthread_t pthread_id;pthread_attr_t thread_attr;int status;status  pthread_attr_init(thread_attr);if(status ! 0)printf(init error\n);size_t stacksize  100;status  pthread_attr_getstacksize(thread_attr, stacksize);printf(stacksize(%d)\n, stacksize);//printf(size(%d)\n, sizeof(int));status  pthread_create(pthread_id, NULL, thread1, NULL);while(1){}return 0;
} 运行结果   stacksize(8388608) 段错误 分析 pthread_attr_getstacksize可以获得线程的私有栈的大小我这个机器是8388608字节为8M也就是私有栈最大是8M所以创建的一个线程函数里有个局部数组长度为8M显示段错误虽然数组大小和私有栈一样大但是私有栈除了分配局部变量外还要保存一些管理信息所以肯定要小于8M如果将数组长度减小一定的值就可以看到thread1函数的打印信息。  pthread线程内存布局   我们从图上可以看出两个线程之间的栈是独立的其他是共享的所以在操作共享区域的时候才有可能出现同步需要操作栈不需要同步。 最后我们知道pthread也提供了私有堆机制关于私有堆机制在以后说明。   转载于:https://www.cnblogs.com/snake-hand/p/3148191.html