多线程编程1

来源:互联网 发布:c语言 ip地址 合法性 编辑:程序博客网 时间:2024/06/08 06:47
一组并发线程运行在一个进程的上下文中。每个线程都有他自己独立的线程上下文,包括线程ID,栈,栈指针,程序计数器,条件码和通用的目地寄存器。每个线程和其他线程一起共享进程上下文的剩余部分。这包括整个用户虚拟地址(由只读文本,读写数据,堆,以及所有共享库代码和数据区域组成),线程同样共享打开的文件集合。(在线程中定义的cstatic属性的本地变量虽然不在栈中管理,但是他的作用范围和普通的局部变量一样。因其虽然在.data或.bss中为每个定义分配空间,但是其在符号表中创建的时一个有唯一名字的本地链接器符号,其本质依然时局部变量(深入理解计算机系统二452))

各自独立的线程栈被保存在虚拟地址空间的栈区域中,并且通常被相应的线程独立的访问。(通常而不是总是,时因为不同线程栈不对其他线程设防,如果一个线程以某种方式得到一个指向其他线程栈的指针,那么他就可以读写这个栈的任何部分)(注意,要在取得所需要的线程栈的指针的情况下!,如果直接引用,则程序编译将会不通过,因其访问的是自身的独立线程栈,而此栈没有所要的那个数据(在其他线程栈中))

程序:
#include<unistd.h>
#include<pthread.h>

void *thread( void *vargrp );


int main( int argc, char **argv )
{
    int i;
    pthread_ttid;
    int a =1;

    for( i=0;i<2; i++ )
      pthread_create( &tid, NULL, thread, (void *)i);//创建线程1
   pthread_exit( NULL );
}

void *thread( void *vargp )
{
    int mytid =(int)vargp;

    printf("%d\n", ++a );

    returnNULL;
}
此程序编译不通过,出错提示为a不能识别;
这就体现出了线程调用与调用程序的区别(可能两者不具可比性);
因为mian可以称为主线程,而a由主线程的独立线程栈进行管理,对创建的线程1是不可见的(但是可用指向独立线程栈的指针进行访问)。
将 int a = 1;
改为static int a = 1;
其结果也是编译不通过,出错原因一样。这也证实了虽然静态变量不在栈中管理,但是他的作用范围还是和局部变量一致的。
0 0
原创粉丝点击