По вложенному элементу списка найдите одноуровневое значение списка назад.

Я сам столкнулся с этой проблемой, пытаясь перенести библиотеку, над которой я работал, в OS X. Я искал какое-то время, не найдя отличный ответ. Когда я нашел ответ, я был немного обеспокоен: ответ действительно ", если Apple внедрила неназванные семафоры POSIX, сколько X Serves вы бы купили?" .

To суммировать точки, почему они устарели и почему некоторые функции остаются нереализованными:

  • Приложение 9 Единой спецификации UNIX заявляет, что они не являются обязательными интерфейсами
  • «Большинство переносных код "использует семафоры SYSV
  • Обратная совместимость с POSIX семафорами, которые совместно используют тип sem_t, трудно

Что касается того, что делать, я пошел с GCD семафоры. Что касается того, почему замена предпочтительнее: это единственный собственный неназванный интерфейс семафора, доступный на ванильной ОС X. Очевидно, GCD помог им продать больше X Serves. Я боюсь, что лучшего ответа нет.

Однако, надеюсь, какой-то код будет полезен. Результатом всего этого является то, что вам действительно нужно реализовать свой собственный переносимый интерфейс семафора:

#ifdef __APPLE__
#include 
#else
#include 
#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
}

Это был минимальный набор функций, о которых я заботился; ваши потребности могут отличаться. Надеюсь, это полезно.

0
задан Fauzi 22 March 2019 в 08:26
поделиться