C 线程在 linux 终端中没有 运行

C Thread doesn't run in linux terminal

我的程序必须严格交替使用 2 个线程递增计数器并使用管道文件同步它们。我知道这没有什么意义,但这是一项大学任务。例如,如果我使用 CodeBlocks 运行 它会出现问题,但是当我从 linux 终端执行程序时它不会打印任何内容,我不知道为什么。任何的想法? 这是我的代码:

#include <stdlib.h>
#include <pthread.h>
#include <wait.h>
#include <unistd.h>
#include <string.h>

int contor;
int fd[2];

void* thread_function(void* arg) {
    int* th = (int*)arg;
    char x = 'x';

    while(1)
    {
        if (*th == 0 && contor % 2 == 0 && contor < 100) {
            close(fd[0]);
            write(fd[1], &x, 1);
            contor++;
            printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());
            sleep(0);
            if (contor >= 100)
            {
                pthread_exit(NULL);
            }

        } else if (*th == 1 && contor % 2 == 1 && contor < 100){
            close(fd[1]);
            read(fd[0], &x, 1);

            contor++;
            printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());

            if (contor >= 100)
            {
                pthread_exit(NULL);
            }
        }
        if (contor >= 100)
            {
                pthread_exit(NULL);
            }

    }
}

void main(int argc, char** argv) {
    int tr1 = 0;
    int tr2 = 0;
    pthread_t t1, t2;

    int th0 = 0;


    pipe(fd);

    tr1 = pthread_create(&t1, NULL, &thread_function, (void*)&th0);
    if (tr1) {
        printf("Error creating thread #1!");
    }

    int th1 = 1;

    tr2 = pthread_create(&t2, NULL, &thread_function, (void*)&th1);
    if (tr2) {
        printf("Error creating thread #2!");
    }

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

我编译文件使用: gcc -o ex.exe ex.c -lpthread 我使用以下命令执行可执行文件:./ex.exe

文件描述符由一个进程的所有线程共享。您的一个线程正在关闭管道的一端 (fd[0]) 并写入管道的另一端 (fd[1])。您的另一个线程正在关闭管道的另一端 (fd[1]) 并读取管道的另一端 (fd[0])。此外,它们在 while 循环中多次关闭。

去掉 thread_function 中的 close(fd[0])close(fd[1]) 调用会有所帮助。 thread_function可能还有其他问题,因为我试的时候计数器达到值3后程序停止输出。

提示:使用两个管道。