我有这样一段代码,从一个文件中读入两个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个请求。
你的程序中存在多个bug。
eof
变量。 int int req1, req2, eof; // What is the value of eof? It could be -1 (or anything else).
/*NOT EOF*/
while(eof != -1)
if(count < 5)
{
/*ADD REQUEST TO BUFFER*/
}
如果第一个线程在第二个线程启动前运行了一段时间 那它就会把前两个请求存储到这个变量中去 buffer
和 弃之不用.
为了解决这个问题,你需要等待第二条线程耗尽了 buffer
当它是满的。
count
而不进行任何锁定,这是一种数据竞赛和未定义的行为。你必须用一个mutex来保护(线程间)共享的globals的读写。