zoukankan      html  css  js  c++  java
  • 多线程

    问题

    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.h>
    
    void* thread1(void* a)
    {
    	char m[8388608];
    	printf("thread1
    ");
    }
    
    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
    ");
    
    	size_t stacksize = 100;
    	status = pthread_attr_getstacksize(&thread_attr, &stacksize);
    	printf("stacksize(%d)
    ", stacksize);
    	//printf("size(%d)
    ", 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也提供了私有堆机制,关于私有堆机制在以后说明。


  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3148191.html
Copyright © 2011-2022 走看看