我正在实现循环缓冲区,如下所示:
long windex = 0, rindex = 0, count = 0;
producer_ISR() /* whenever the data avail, then gets the interrupt */
{
/* store the data in array buffer */
array[windex] = data;
windex++;
count = count + 1; /* Increment the count */
if (windex == 32) /* overflow condition */
windex = 0;
}
consumer
{
while(1)
{
if(count > 0)
{
/* process the data */
data1 = array[rindex];
rindex++;
count = count - 1; /* decrement the count */
if (rindex == 32 ) /* overflow condition */
rindex = 0;
}
}
}
此代码是否需要信号量来保护上述两个函数之间的共享变量“count”?
根据我的分析,信号量不是必需的,请分享您的想法。
答案 0 :(得分:1)
如果可以有多个消费者,则需要一个信号量,因为2个消费者可以检查计数,然后使用相同的元素,或者可以尝试使用不存在的元素。
同样适用于生产者。
如果只有1个消费者和1个生产者,如果count = count + 1
和/或count = count - 1
不是原子的,则只需要信号量。如果它不是原子的,那么就会发生这样的事情:
count = 1 // initial value
Get count for "count = count + 1" as 1
Get count for "count = count - 1" as 1
count = 1 + 1 = 2
count = 1 - 1 = 0
然后当实际有一个项目等待时你有count = 0
。
另请注意,如果缓冲区填满,代码可能需要进行一些错误检查。