C语言中的Pthreads,第二个线程无法执行。

问题描述 投票:0回答:1

我有这样一段代码,从一个文件中读入两个int数字。并将其存储在一个缓冲区[]中,以便在第二个函数中取用。我不知道我在第一个函数中的停止条件是否正确。它看起来很好,但当运行代码时,它在第二个函数中停止。

static int count = 0;
int buffer[5];
int requestNum = 1;
FILE* f;

int main(int argc, char** argv)
{
    /*THREAD IDs*/
    pthread_t liftR, lift1;

    /*OPEN FILE*/
    f = fopen("sim_input.txt", "r");

    /*CREATE THREAD*/
    pthread_create(&liftR, NULL, request, NULL);
    pthread_create(&lift1, NULL, lift, NULL);

    /*RUNS TILL THREADS FINISHED*/
    pthread_join(liftR, NULL);
    pthread_join(lift1, NULL);
    /*CLEAN UP*/
    fclose(f);

    return 0;
} 
void* request(void* data1)
{
    int req1, req2, eof;

    /*NOT EOF*/
    while(eof != -1)
    {
        /*READ ONE REQUEST*/
        eof = fscanf(f, "%d %d", &req1, &req2);

        /*CHECK IF BUFFER FULLL*/
        if(count < 5)
        {
            /*ADD REQUEST TO BUFFER*/
            buffer[count] = req1;
            buffer[count + 1] = req2;

            count = count + 2;
            printf("COUNT: %d\n", count);
            /*PRINTING*/
            printf("-------------------------------------------\n");
            printf("From Buffer -> Item1: %d, Item2: %d\n", req1, req2);
            printf("Request No: %d\n", requestNum);
            printf("-------------------------------------------\n");

            requestNum++;
        }
    }

    return NULL;
}  

void* lift(void* data2)
{
    while(count > 0)
    {
        sleep(1);
        printf("================\n");
        printf("COUNT: %d\n", count);
        printf("REMOVE ITEM FROM BUFFER - DO STUFF WITH IT\n");
        printf("================\n");
        count = count - 2;
    }
    return NULL;
}  

OUTPUT:显示计数2,4,6。只显示3个请求,在文件中,它上升到10个请求。

c pthreads
1个回答
0
投票

你的程序中存在多个bug。

  1. 读取未初始化的 eof 变量。
    int int req1, req2, eof;  // What is the value of eof? It could be -1 (or anything else).

    /*NOT EOF*/
    while(eof != -1)
  1. 读取的数据会被扔掉
        if(count < 5)
        {
            /*ADD REQUEST TO BUFFER*/
        }

如果第一个线程在第二个线程启动前运行了一段时间 那它就会把前两个请求存储到这个变量中去 buffer弃之不用.

为了解决这个问题,你需要等待第二条线程耗尽了 buffer 当它是满的。

  1. 您访问 count 而不进行任何锁定,这是一种数据竞赛和未定义的行为。你必须用一个mutex来保护(线程间)共享的globals的读写。
© www.soinside.com 2019 - 2024. All rights reserved.