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; 
          }
     }
}

このコードでは、上記の 2 つの関数の間で共有変数「count」を保護するためにセマフォが必要ですか?

私の分析によると、セマフォは必要ありません。アイデアを共有してください。

4

1 に答える 1

1

複数のコンシューマーが存在する可能性がある場合は、2 つのコンシューマーがカウントを確認してから同じ要素を消費するか、存在しない要素を消費しようとする可能性があるため、セマフォが必要です。

プロデューサーも同様。

1 つのコンシューマーと 1 つのプロデューサーしか存在できない場合、count = count + 1and/orcount = 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 に答える