这个循环缓冲区实现是否需要信号量?

时间:2013-08-23 10:08:48

标签: concurrency language-agnostic semaphore circular-buffer

我正在实现循环缓冲区,如下所示:

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”?

根据我的分析,信号量不是必需的,请分享您的想法。

1 个答案:

答案 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

另请注意,如果缓冲区填满,代码可能需要进行一些错误检查。