当前位置: 技术问答>linux和unix
全局下定义的static变量的问题
来源: 互联网 发布时间:2015-08-17
本文导语: 全局下定义的static变量在fork和pthread是如何处理的,是复制还是共享 例如: static int gval; main() { .... if(0 == fork()) { gval = ??; ....; } .... } 或 static int gval = ...
全局下定义的static变量在fork和pthread是如何处理的,是复制还是共享
例如:
static int gval;
main()
{
....
if(0 == fork())
{
gval = ??;
....;
}
....
}
或
static int gval = 10;
main()
{
....
pthread_create(...., dosth);
....
}
dosth(void)
{
gval = ??;
....
}
对以上两个结构而言,static变量是否共享还是独立的?
我手头没有unix,谁帮看看
例如:
static int gval;
main()
{
....
if(0 == fork())
{
gval = ??;
....;
}
....
}
或
static int gval = 10;
main()
{
....
pthread_create(...., dosth);
....
}
dosth(void)
{
gval = ??;
....
}
对以上两个结构而言,static变量是否共享还是独立的?
我手头没有unix,谁帮看看
|
ft,原来楼主的例1例2跟顶楼不同,我那个回复说的是fork和pthread_create的区别啊
pthread_create出来的东西都是共享的,static也不例外
例2是编译不过的,因为那个static出来的int作用域不是全局的,别的地方extern不到
gcc -o test1 test1.c -lpthread
#include
#include
static int gval = 10;
void* test();
int main()
{
int ret;
pthread_t pt;
ret = pthread_create( &pt, NULL, test, NULL );
if( ret != 0 )
{
printf( "error thread createn" );
return 0;
}
sleep(3);
if( 20 == gval )
printf( "共享n" );
else
printf( "独立n" );
return 0;
}
void* test()
{
gval = 20;
return 0;
}
pthread_create出来的东西都是共享的,static也不例外
例2是编译不过的,因为那个static出来的int作用域不是全局的,别的地方extern不到
gcc -o test1 test1.c -lpthread
#include
#include
static int gval = 10;
void* test();
int main()
{
int ret;
pthread_t pt;
ret = pthread_create( &pt, NULL, test, NULL );
if( ret != 0 )
{
printf( "error thread createn" );
return 0;
}
sleep(3);
if( 20 == gval )
printf( "共享n" );
else
printf( "独立n" );
return 0;
}
void* test()
{
gval = 20;
return 0;
}
|
闹了半天楼主都没弄明白我说的东西
-_-b
-_-b
|
子进程会产生另外一个指针变量,虽然但它和父进程的指针的值是相同的,在子进程里面改变指针指向的内容,不会影响父进程。因为指针寻址还会加上进程首地址作偏移量。
|
上面的说法可能会让你产生误解,补充一下吧:
不同进程运行在各自的内存空间中,每个进程都有他独立的内存空间,即操作系统为每个进程分配一个物理地址,进程中的地址只是一个相对地址而已,并不是真正的指向物理地址,代码和变量的实际地址由操作系统和硬件来转换。
不同进程运行在各自的内存空间中,每个进程都有他独立的内存空间,即操作系统为每个进程分配一个物理地址,进程中的地址只是一个相对地址而已,并不是真正的指向物理地址,代码和变量的实际地址由操作系统和硬件来转换。
|
一个进程创建的线程是分享共同的内存空间的
|
楼上正好说反了
例一里的gval是个进程独立的
例二中才是共享的
例一里的gval是个进程独立的
例二中才是共享的