0

次のコードがあります。

int resource;
sem_t s;

void function2()
{
   // do some operation to resource
}


void function1()
{
   sem_wait(&s);

   function2();

   sem_post(&s);
}

function1別のプロセスを同時に呼び出し、function1すでにセマフォで保護されている場合、保護するためにセマフォが必要function2ですか?

4

3 に答える 3

0

あなたのコードから、function1 ではなく function1 内で Function call(function2()) を保護したと言えます。function1 を参照するすべての呼び出しは、function2 から戻るまで待機します。関数 2 内でリソースを共有していない限り、関数 2 を再度保護する必要はないと思います。関数 2 内でリソースを共有している場合は、そのリソースを保護する必要があります。

于 2013-06-26T09:55:27.503 に答える
0

@VoidPointer がコメントで述べたように、function2 が他の場所ではなく function1 内で呼び出された場合は必要ありません。

その理由は簡単にわかります。関数 2 が呼び出しの場所にインライン化されていると考えることができますよね。sem_wait と sem_post の間には常に 1 つのプロセスしかないため、データは安全です。

しかし、@rakib が言ったように、不必要な待機を避けるために必要なときにのみデータをロックすることをお勧めします。

ミューテックスではなくセマフォを使用しますか? 例を参照してください:バイナリセマフォとミューテックスの違い

于 2013-06-26T11:59:02.417 に答える