0


0

初期化されていないセマフォの値

Linuxのsemaphore.hのセマフォ実装を参照して、初期化されていないセマフォsem_tのデフォルトは0ですか?

セマフォを0に初期化するのを忘れていたことを発見しました。 それでも、プログラムはsem_initなしで正常に機能しました。

(すべての純粋主義者にとって、そうすることは悪い習慣であることに完全に同意します。)

3 Answer


2


公式には「未定義」だと思います。 つまり、何でもかまいません。 あなたの場合、なんらかの理由で、たまたま0になっていますが、それは幸運です。 明日は5になるかもしれません。


2


セマフォがどのように/どこで定義されているかに依存します。

  • グローバル変数(の一部)として定義されている場合、コンパイラ 値を指定しない場合は、0に初期化する必要があります

  • これは、宣言されたブロックスコープ変数(の一部)でも同様です。 「静的」として。

  • それが(一部の)非静的なブロックスコープ変数である場合、 そのメモリ位置に以前に保存された値から始めます。


1


これは、オペレーティングシステム/セマフォの実装ではなく、コンパイラに依存します。 Bartの答えは、この場合のC標準をカバーしています。

ただし、http://www.opengroup.org/onlinepubs/000095399/basedefs/semaphore.h.html [Unix standard]によれば、 sem_t`が0であることや、 sem_tであることに依存することすらすべきではありません。 * `NULL;単一化された変数で `sem_init`を使用しても安全です。 セマフォに指定される唯一の特別な値は `sem_t *`値 `SEM_FAILED`であり、その値は実装固有です。