使用线程打印全局变量
Print a global variable using thread
这是我的代码,我在 CodeBlocks 上编写脚本,但在 Cygwin 上编译。当我执行代码时,最后的 printf
打印我 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) 这里,
layer * tempo;
layer/1000000000; // I need this for getting the gigabyte
您正在计算图层但丢弃结果!
你可能想要:
layer = layer * tempo;
layer = layer/1000000000;
需要对所有线程进行此更改。
2) layer
属于 long long
。因此最后的除法 (layer = layer/1000000000
) 可能变为零(由于整数除法)。而是使用 long double
.
3) 你有一个局部变量 long long int layer;
隐藏了全局变量。如果要存储结果(而不是在本地计算值并返回结果),则更改:
long long int layer = frame * 25;
至
layer = frame * 25;
需要对所有线程函数进行此更改。
4) 您 main()
线程没有等待其他线程完成。所以它可能会在另一个线程完成之前退出。因此,您应该在创建线程后在 main()
中调用 pthread_exit(0)
或 pthread_join(t1, 0);
。
当main()
退出时,整个进程结束。 pthread_join()
会让它等待线程完成。 pthread_exit()
将确保只有主线程死亡,而不是整个进程。
layer/1000000000
将始终是 0
,因为您的任务重新定义了 layer
变量,不会修改全局变量。
然后翻译将是 1/1000000000
,在 long long int
中将是 0
如果你想避免这种变化:
long long int layer = frame * 25;
和
layer = frame * 25;
在所有任务功能中。
另一件事是
layer * tempo;
layer/1000000000;
您没有修改任何内容
我想你的意思是:
layer *= tempo;
layer /= 1000000000;
正如 l3x
所写,您至少需要为启动的每个任务调用 pthread_join
让 main
等待每个任务的结束。
这是我的代码,我在 CodeBlocks 上编写脚本,但在 Cygwin 上编译。当我执行代码时,最后的 printf
打印我 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) 这里,
layer * tempo;
layer/1000000000; // I need this for getting the gigabyte
您正在计算图层但丢弃结果!
你可能想要:
layer = layer * tempo;
layer = layer/1000000000;
需要对所有线程进行此更改。
2) layer
属于 long long
。因此最后的除法 (layer = layer/1000000000
) 可能变为零(由于整数除法)。而是使用 long double
.
3) 你有一个局部变量 long long int layer;
隐藏了全局变量。如果要存储结果(而不是在本地计算值并返回结果),则更改:
long long int layer = frame * 25;
至
layer = frame * 25;
需要对所有线程函数进行此更改。
4) 您 main()
线程没有等待其他线程完成。所以它可能会在另一个线程完成之前退出。因此,您应该在创建线程后在 main()
中调用 pthread_exit(0)
或 pthread_join(t1, 0);
。
当main()
退出时,整个进程结束。 pthread_join()
会让它等待线程完成。 pthread_exit()
将确保只有主线程死亡,而不是整个进程。
layer/1000000000
将始终是 0
,因为您的任务重新定义了 layer
变量,不会修改全局变量。
然后翻译将是 1/1000000000
,在 long long int
中将是 0
如果你想避免这种变化:
long long int layer = frame * 25;
和
layer = frame * 25;
在所有任务功能中。
另一件事是
layer * tempo;
layer/1000000000;
您没有修改任何内容 我想你的意思是:
layer *= tempo;
layer /= 1000000000;
正如 l3x
所写,您至少需要为启动的每个任务调用 pthread_join
让 main
等待每个任务的结束。