C语言 使用线程打印全局变量



这是我的代码,我在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(layerlong long的。所以最终的除法(layer = layer/1000000000(可以变成零(由于整数除法(。而是使用 long double .

3(你有一个局部变量long long int layer;它隐藏了全局变量。如果要存储结果(而不是在本地计算值并返回结果(,请更改:

long long int  layer = frame * 25;

layer = frame * 25;

需要对所有线程函数进行此更改。

4(您main()线程没有等待另一个线程完成。因此,它可能会在另一个线程完成之前退出。因此,您应该在创建线程后调用pthread_exit(0)pthread_join(t1, 0); main()

main()退出时,整个过程就死了。 pthread_join()会让它等待线程完成。 pthread_exit()将确保只有主线程死亡,而不是整个过程。

layer/1000000000将始终0,因为您的任务重新定义了layer var,并且不会修改全局变量。

然后翻译将被1/1000000000,这将在long long int0如果要避免该更改:

long long int  layer = frame * 25;

layer = frame * 25;

在所有任务功能中。

另一件事是,随着

layer * tempo;
layer/1000000000;

你没有修改任何东西我想你的意思是:

layer *= tempo;
layer /= 1000000000;

正如l3x已经写的那样,您至少需要为您启动的每个任务调用pthread_join,以使main等待每个任务的完成。

最新更新