我正在Linux上的一个小型C程序上工作,并且两个线程需要使用相同的文件描述符(实际上是unix域套接字),因此我只设置了文件描述符的gloabl变量,在一个线程中打开文件并在另一个线程,但似乎没有共享,我将代码简化如下:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<fcntl.h>
int gfd = 0;
int test = 2;
void* thr_fun1(void* arg)
{
printf("thr 1 gfd %d test %d \n",gfd, test);
}
int main()
{
int gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);
pthread_t tid;
int err;
printf("thr main gfd %d test %d \n",gfd, test);
test = 12;
err = pthread_create(&tid, NULL, thr_fun1, NULL);
if(0 != err)
printf("can't create thread\n");
sleep(2);
}
操作系统为Ubuntu 16.04.4 LTS(GNU / Linux 4.13.0-36-通用x86_64)
liu@ns:~$ gcc -pthread -o fd fd.c
liu@ns:~$ ./fd
thr main gfd 3 test 2
thr 1 gfd 0 test 12
我的问题是:为什么共享全局变量test
但不共享全局变量gfd
?
答案 0 :(得分:1)
简短的回答是,您在线程中打印的名为gfd
的变量是全局变量,而在main
中设置的变量不是全局变量。您声明了两个不同的变量:
int gfd = 0;
这实际上是全球性的。int gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);
这是main
的本地内容。 main
中的打印输出引用#2,而thr_fun1
中的打印输出引用#1。
要更改此设置,请删除以下类型,将main中的赋值修改为赋值,而不是声明:
gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);