gpt4 book ai didi

c - 有界缓冲区程序引入数据竞争 : Where are they? 如何修复它们?

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:13 25 4
gpt4 key购买 nike

我正在编写一个程序,它简单地演示了在有界缓冲区中写入和读取它输出预期的值和实际读取的值。当我将 N 定义为一个较低的值时,程序会按预期执行。但是,当我增加该值时,我开始看到意想不到的结果。据我了解,我正在使用两个线程创建数据竞争。

通过查看输出,我认为我已将其缩小为大约三个数据竞争示例,如下所示:

  1. 一个线程写入缓冲区,而另一个线程读取。
  2. 两个线程同时写入缓冲区。
  3. 两个线程同时从缓冲区读取。

下面是我的代码。 #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);
}

所以这是我的问题。

  1. 这些数据竞争发生在什么地方(在我的代码中)?
  2. 我该如何修复它们?

最佳答案

使用互斥锁来同步对共享数据结构的访问。您将需要以下内容:

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);

作为一个基本原则,在读取/写入线程间共享的数据结构之前锁定互斥锁,然后再解锁。在这种情况下,Buffer 加上元数据 numOccupiedfirstOccupied 是您需要保护的共享数据结构。所以在buffadd()buffrem()中,开始时锁定互斥量,结束时解锁。并且在 main() 中,在启动线程之前初始化互斥锁,并在加入后销毁它。

关于c - 有界缓冲区程序引入数据竞争 : Where are they? 如何修复它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10149609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com