gpt4 book ai didi

c - 为什么 sem_init()、sem_getvalue()、sem_destroy() 在 Mac OS X 上被弃用了——什么替代了它们?

转载 作者:太空狗 更新时间:2023-10-29 16:23:07 27 4
gpt4 key购买 nike

当我使用 POSIX sem_init() 编译程序时函数,我收到编译警告(错误,因为我通常使用 -Werror)当我在 Mac OS X 10.10.1 (Yosemite) 上使用 GCC 4.9.1 或以下版本编译时,该函数已被弃用来自 XCode 6.1.1 的 Clang(Apple LLVM 版本 6.0 (clang-600.0.56)(基于 LLVM 3.5svn))。快速查看 /usr/include/sys/semaphore.h 可以看出该函数在其声明后确实有一个 __deprecated 标记,正如 sem_getvalue()sem_destroy() .

问题:

  1. 鉴于 POSIX 规范中没有弃用的提示,为什么这三个函数在 Mac OS X 上被单独列为弃用?

  2. 鉴于它们已被弃用,替代品是什么,为什么首选替代品?

(我首先检查了 Ask Different;没有标记为 的问题,也没有关于已弃用系统调用的问题 — 只有程序。)

最佳答案

我在尝试将我正在处理的库移植到 OS X 时遇到了这个问题。我搜索了一段时间,但没有找到很好的答案。当我确实找到答案时,我有点不安:答案实际上是 "if Apple implemented POSIX unnamed semaphores, how many X Serves would you buy?" .

总结它们被弃用的原因以及某些功能仍未实现的原因:

  • 单一 UNIX 规范的附录 9 声明它们不是强制性接口(interface)
  • “最便携的代码”使用 SYSV 信号量
  • 与共享 sem_t 类型的 POSIX 命名信号量向后兼容很困难

至于该怎么做,我选择了 GCD 信号量。至于为什么首选替代品:它是 vanilla OS X 上唯一可用的 native 未命名信号量接口(interface)。显然 GCD 帮助他们销售了更多的 X 服务。恐怕没有更好的答案了。

但是,希望一些代码会有所帮助。所有这一切的结果是您实际上必须实现自己的可移植信号量接口(interface):

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

这是我关心的最小功能集;您的需求可能会有所不同。希望这对您有所帮助。

关于c - 为什么 sem_init()、sem_getvalue()、sem_destroy() 在 Mac OS X 上被弃用了——什么替代了它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com