web-dev-qa-db-ja.com

Mac OS Xでsem_init()、sem_getvalue()、sem_destroy()が非推奨になっているのはなぜですか?また、何がそれらを置き換えるのですか?

POSIX sem_init() 関数を使用してプログラムをコンパイルすると、コンパイル時に関数が廃止されているというコンパイル警告(通常は_-Werror_を使用するためエラー)が表示されますMac OS X 10.10.1(Yosemite)とGCC 4.9.1、またはXCode 6.1.1のClang(Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn))のバージョン。 _/usr/include/sys/semaphore.h_をざっと見てみると、関数の宣言の後に実際に___deprecated_タグがあり、 sem_getvalue() および sem_destroy()

質問:

  1. POSIX仕様に非推奨のヒントがないことを考えると、これらの3つの関数がMac OS Xで非推奨として選択されているのはなぜですか?

  2. それらが非推奨であることを考えると、置換は何であり、なぜ置換が好ましいのですか?

私は最初にチェックしました 異なる質問 最初にタグ付けされた質問はありません c と非推奨のシステムコールについて尋ねる質問はありません—プログラムのみです。

33

自分が取り組んでいるライブラリをOS Xに移植しようとしたときに、自分でこの問題に遭遇しました。すばらしい答えを見つけることなくしばらく探しました。私が答えを見つけたとき、私は少し混乱しました:答えは事実上 "if Apple POSIXの名前のないセマフォを実装した場合、Xサーバーをいくつ購入しますか?"

それらが非推奨である理由と、一部の機能が未実装のままである理由の要点を要約すると、次のようになります。

  • シングルUNIX仕様の付録9には、必須のインターフェースではないと記載されています。
  • 「ほとんどの移植可能なコード」はSYSVセマフォを使用します
  • sem_tタイプを共有するPOSIX名前付きセマフォとの下位互換性は難しい

代わりに何をするかについては、GCDセマフォを使いました。なぜ置換が推奨されるのか:バニラOS Xで利用できる唯一のネイティブの名前のないセマフォインターフェースです。GCDがXサーバーの販売を促進したようです。これ以上の答えはないでしょう。

ただし、うまくいけば、いくつかのコードが役立つでしょう。これらすべての結果として、独自のポータブルセマフォインターフェースを効果的に実装する必要があります。

#ifdef __Apple__
#include <dispatch/dispatch.h>
#else
#include <semaphore.h>
#endif

struct rk_sema {
#ifdef __Apple__
    dispatch_semaphore_t    sem;
#else
    sem_t                   sem;
#endif
};


static inline void
rk_sema_init(struct rk_sema *s, uint32_t value)
{
#ifdef __Apple__
    dispatch_semaphore_t *sem = &s->sem;

    *sem = dispatch_semaphore_create(value);
#else
    sem_init(&s->sem, 0, value);
#endif
}

static inline void
rk_sema_wait(struct rk_sema *s)
{

#ifdef __Apple__
    dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER);
#else
    int r;

    do {
            r = sem_wait(&s->sem);
    } while (r == -1 && errno == EINTR);
#endif
}

static inline void
rk_sema_post(struct rk_sema *s)
{

#ifdef __Apple__
    dispatch_semaphore_signal(s->sem);
#else
    sem_post(&s->sem);
#endif
}

これは、私が気にかけた最小限の機能セットでした。あなたのニーズは異なる場合があります。うまくいけば、これは役に立ちます。

30
dho