C 程序卡住,不进入 main()

C Program is stuck, doesnt enter main()

我正在尝试 运行 一个程序,其中一个线程从标准输入获取数据,然后另一个线程在标准输出上提供数据,没有什么太复杂,但是当我 运行 我的程序使用 /.filename < test.in > test.out 它什么都不做。当我使用 gcc -pthread filename.c -o filename -W -Wall 编译它时,似乎没有错误或警告。有人可以解释吗?同样在文件 test.out 中没有显示任何内容,在 test.in 中是一个简单的句子。 这是节目

#define V  300

pthread_cond_t cond;
pthread_mutex_t mutex;
char a[300];
int p = 0;
int w = 0;


void *thread1() {

    while(1){
        pthread_mutex_lock(&mutex);
        printf("thread1");
        while(p >0){
            pthread_cond_wait(&cond, &mutex);
        }

        p = fread(a, sizeof(char), V ,stdin);

        if(p == 0){
            pthread_exit(NULL);
        }
        if(p <= V){ 
            pthread_cond_signal(&cond);
        }
        pthread_mutex_unlock(&mutex);
    }

}

void *thread2() {
    while(1){
        pthread_mutex_lock(&mutex);
        printf("thread2");

        while(w >0){
            pthread_cond_wait(&cond, &mutex);
        }

        w = fwrite(a, sizeof(char),p, stdout);

        if(w == 0){
            pthread_exit(NULL);
        }
        if(w <= V ){ 
            pthread_cond_signal(&cond);
        }
        pthread_mutex_unlock(&mutex);
    }
}

int main (void) {
    printf("main/n");
    fflush(stdout);
    pthread_t t1, t2; 

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init (&cond, NULL);

    pthread_create(&t1, NULL, vlakno1,  NULL);
    pthread_create(&t2, NULL, vlakno2,  NULL);


    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    return 0;
}

由于 printf("main/n");

中的拼写错误,您在终端上看不到任何内容

printf 的输出不会刷新到 stdout 并且创建的线程会永远消耗循环,或者至少会消耗很长时间。

您应该在 printf 语句之后添加 fflush(stdout); 以验证这一点。

然后你可以尝试 printf("main\n"); 没有 fflush() 来验证 stdout 是行缓冲的,即:当输出换行符时输出被刷新到终端。

如果您将输出重定向到一个文件,stdout 通常是完全缓冲的,因此您应该在每个输出操作之后添加一个显式的 fflush(stdout);,这样您就可以在输出文件中看到输出fly 或者杀掉程序后。

请注意,如果您使用英文单词作为标识符、类型、注释和消息,代码将更易于此处的大多数用户阅读。

您的 printf("main/n"); 而不是 printf("main\n");(或只是 puts("main");)中有明显的拼写错误,但这是一个细节,而不是您的程序永远无法完成的原因

vlakno1 中你创建了一个死锁:

    if(poc_precitanych == 0){
        pthread_exit(NULL);
    }

因为你没有解锁互斥体,必须

    if(poc_precitanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

你在 vlakno2 中遇到了同样的问题:

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

必须是

    if(pocet_pisanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

下面也很奇怪:

    pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

即使不是不可能,也很难在stdou上写不成功。所以你走出那个循环的唯一机会是 poc_precitanych 估值 0

补充说明,你 #define V 300 但你在别处使用 V 时却 char a[300];。最好做 char a[V]; 或在别处使用 sizeof(a) 而不定义 V


修改后的执行示例:

/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2

没有什么可读的所以 poc_precitanych 值 0 并且两个线程完成,但是

/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C