我正在编写一个程序,该程序仅演示从有界缓冲区写入和读取,因为它输出预期的值和实际读取的值。当我将 N 定义为低值时,程序按预期执行。但是,当我增加值时,我开始看到意想不到的结果。据我了解,我正在使用两个线程创建数据竞争。
通过查看输出,我认为我已将其范围缩小到大约三个数据竞争示例,如下所示:
- 一个线程写入缓冲区,而另一个线程读取。
- 两个线程同时写入缓冲区。
- 两个线程同时从缓冲区读取。
下面是我的代码。#include 语句的格式真的很奇怪,所以我把它们排除在外。
#define BUFFSIZE 10000
#define N 10000
int Buffer[BUFFSIZE];
int numOccupied = 0; //# items currently in the buffer
int firstOccupied = 0; //where first/next value or item is to be found or placed
//Adds a given value to the next position in the buffer
void buffadd(int value)
{
Buffer[firstOccupied + numOccupied++] = value;
}
int buffrem()
{
numOccupied--;
return(Buffer[firstOccupied++]);
}
void *tcode1(void *empty)
{
int i;
//write N values into the buffer
for(i=0; i<N; i++)
buffadd(i);
}
void *tcode2(void *empty)
{
int i, val;
//Read N values from the buffer, checking the value read with what is expected for testing
for(i=0; i<N; i++)
{
val = buffrem();
if(val != i)
printf("tcode2: removed %d, expected %d\n", val, i);
}
}
main()
{
pthread_t tcb1, tcb2;
pthread_create(&tcb1, NULL, tcode1, NULL);
pthread_create(&tcb2, NULL, tcode2, NULL);
pthread_join(tcb1, NULL);
pthread_join(tcb2, NULL);
}
所以这是我的问题。
- 这些数据竞争发生在哪里(在我的代码中)?
- 我该如何修复它们?