Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用线程打印全局变量_C_Multithreading_Cygwin_Pthreads - Fatal编程技术网

C 使用线程打印全局变量

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){

这是我的代码,我在代码块上编写脚本,但我在Cygwin上编译。当我执行代码时,最终的
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;