0

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

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

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

4

1 回答 1

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当实际上有一个项目在等待时,您就有了。

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

于 2013-09-15T22:41:20.170 回答