C 使用线程打印全局变量
这是我的代码,我在代码块上编写脚本,但我在Cygwin上编译。当我执行代码时,最终的C 使用线程打印全局变量,c,multithreading,cygwin,pthreads,C,Multithreading,Cygwin,Pthreads,这是我的代码,我在代码块上编写脚本,但我在Cygwin上编译。当我执行代码时,最终的printfprint me 0,我不明白为什么。我尝试了我所知道的一切。我在高中四年级。此代码接收一个int变量(sec),并使用它来计算胶片的重量 #include <stdlib.h> #include <stdio.h> #include <pthread.h> long long int layer=1; void* res_VGA (void* sec){
printf
print me 0,我不明白为什么。我尝试了我所知道的一切。我在高中四年级。此代码接收一个int变量(sec
),并使用它来计算胶片的重量
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
long long int layer=1;
void* res_VGA (void* sec){
int tempo = (intptr_t) sec;
int res = 640*480; //resolution
int frame = res * 3; // the rgb
long long int layer = frame * 25; // 25 frame Hz
layer * tempo;
layer/1000000000; // I need this for getting the gigabyte
pthread_exit(0);
}
void* res_HD (void* sec){
int tempo = (intptr_t) sec;
int res = 1080*720;
int frame = res * 3;
long long int layer = frame * 25;
layer * tempo;
layer/1000000000;
pthread_exit(0);
}
void* res_FHD (void* sec){
int tempo = (intptr_t) sec;
int res = 1920*1080;
int frame = res * 3;
long long int layer = frame * 25;
layer * tempo;
layer/1000000000;
pthread_exit(0);
}
int main(){
int sec,res;
pthread_t t1;
printf("Inserisci il numero di secondi: \n");
scanf("%d",&sec);
printf("Seleziona il tipo di risoluzione: \n");
printf("1) VGA \n");
printf("2) HD \n");
printf("3) FHD \n");
do{
scanf("%d",&res);
if(res == 1){
pthread_create(&t1, NULL, res_VGA, (void*)(intptr_t)sec);
}
else if(res == 2){
pthread_create(&t1, NULL, res_HD, (void*)(intptr_t)sec);
}
else if(res == 3){
pthread_create(&t1, NULL, res_FHD, (void*)(intptr_t)sec);
}
}while(res != 1 && res != 2 && res != 3);
printf("Il film pesa %lld byte", layer/1000000000);
return 0;
}
#包括
#包括
#包括
长整型层=1;
无效*分辨率(无效*秒){
节拍=秒;
int res=640*480;//分辨率
int frame=res*3;//rgb
长整型层=帧*25;//25帧赫兹
层*节奏;
layer/100000000;//我需要这个来获取千兆字节
pthread_退出(0);
}
无效*恢复HD(无效*秒){
节拍=秒;
int res=1080*720;
int帧=分辨率*3;
长整型层=帧*25;
层*节奏;
层/100000000;
pthread_退出(0);
}
无效*恢复FHD(无效*秒){
节拍=秒;
int res=1920*1080;
int帧=分辨率*3;
长整型层=帧*25;
层*节奏;
层/100000000;
pthread_退出(0);
}
int main(){
国际证券交易委员会;
pthread_t t1;
printf(“第二个数字的插入:\n”);
扫描频率(“%d”秒和“&sec”);
printf(“位于risoluzione的Seleziona il tipo:\ n”);
printf(“1)VGA\n”);
printf(“2)HD\n”);
printf(“3)FHD\n”);
做{
扫描频率(“%d”、&res);
如果(res==1){
pthread_create(&t1,NULL,res_VGA,(void*)(intptr_t)sec);
}
否则如果(res==2){
pthread_create(&t1,NULL,res_HD,(void*)(intptr_t)sec);
}
否则如果(res==3){
pthread_create(&t1,NULL,res_FHD,(void*)(intptr_t)sec);
}
}而(res!=1&&res!=2&&res!=3);
printf(“Il胶片pesa%lld字节”,层/100000000);
返回0;
}
您有多个问题
1) 这里,
您正在计算层,但放弃结果
您可能想要:
layer = layer * tempo;
layer = layer/1000000000;
需要对所有线程进行此更改
2) 层
的长度为long
。因此,最终的除法(layer=layer/100000000
)可能会变为零(由于整数除法)。改为使用长双精度
3) 您有一个局部变量long int层代码>对全局变量进行阴影处理。如果要存储结果(而不是在本地计算值并返回结果),请更改:
long long int layer = frame * 25;
到
需要对所有线程函数进行此更改
4) 您的main()
线程没有等待另一个线程完成。因此,它可能在另一个线程完成之前退出。因此,您应该调用pthread\u exit(0)
或pthread\u join(t1,0)创建线程后,在main()
中执行code>
当退出main()
时,整个过程将终止pthread_join()
将使它等待线程完成pthread_exit()
将确保只有主线程死亡,而不是整个过程。layer/100000000
将始终为0
,因为您的任务会重新定义layer
变量,并且不会修改全局变量
然后翻译将是1/100000000
,即0
中的long-long-int
如果要避免该更改,请执行以下操作:
long long int layer = frame * 25;
与
在所有的任务中,都有功能
另一件事是
layer * tempo;
layer/1000000000;
你什么都没改
我想你的意思是:
layer *= tempo;
layer /= 1000000000;
正如l3x
所写,您至少需要为启动的每个任务调用pthread\u join
,让main
等待每个任务的结束。这是可能的,因为层是int
而不是float,当你把它除以100000000
时,它必须是0.xx
,它会截断答案“final printf print me 0”,因为在任何情况下,代码都会打印1/100000000
的结果。或者,这个过程在任何计算发生之前就结束了。
layer = frame * 25;
layer * tempo;
layer/1000000000;
layer *= tempo;
layer /= 1000000000;