C 中的 pthreads,第二个线程不会执行



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

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: %dn", count);
/*PRINTING*/
printf("-------------------------------------------n");
printf("From Buffer -> Item1: %d, Item2: %dn", req1, req2);
printf("Request No: %dn", requestNum);
printf("-------------------------------------------n");
requestNum++;
}
}
return NULL;
}  
void* lift(void* data2)
{
while(count > 0)
{
sleep(1);
printf("================n");
printf("COUNT: %dn", count);
printf("REMOVE ITEM FROM BUFFER - DO STUFF WITH ITn");
printf("================n");
count = count - 2;
}
return NULL;
}  

输出:显示计数2、4、6。只显示了3个请求,在文件中最多显示了10个请求

您的程序中有多个错误:

  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时没有任何锁定,这是一种数据竞争和未定义的行为。您必须使用互斥锁来保护读取和写入共享(线程之间(全局对象

最新更新