首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Mac上不推荐sem_init()、sem_getvalue()、sem_destroy()?

为什么在Mac上不推荐sem_init()、sem_getvalue()、sem_destroy()?
EN

Stack Overflow用户
提问于 2015-01-02 02:08:23
回答 1查看 26.9K关注 0票数 47

当我使用POSIX sem_init()函数编译程序时,会收到编译警告(因为我通常使用-Werror),即在MacOSX10.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规范中没有表示反对的暗示,为什么这三个函数在Mac上被单独指定为不建议使用的功能?
  2. 如果他们被反对,什么是替代,为什么替代优先?

(我确实先检查了https://apple.stackexchange.com/;没有标注/问题/加标签/c的问题,也没有关于仅推荐的系统调用程序的问题。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-08 18:30:28

我在尝试将一个库移植到OS X时遇到了这个问题。我搜索了一段时间,没有找到一个很好的答案。当我找到答案时,我有点不安:答案实际上是“如果苹果公司实施了POSIX未命名信号量,你会购买多少X服务?”

总结一下为什么不推荐它们以及为什么某些功能仍然未实现的原因:

  • 单一UNIX规范的附录9声明它们不是强制性接口
  • “大多数可移植代码”使用SYSV信号量。
  • 与共享sem_t类型的POSIX命名信号量的向后兼容性是困难的

至于该做什么,我用GCD信号灯。至于为什么选择替换:它是唯一在香草OS X上可用的本地未命名的信号量接口。显然,GCD帮助他们销售了更多的X服务。恐怕没有更好的答案了。

但是,希望一些代码会有所帮助。所有这些的结果是,您必须有效地实现您自己的便携式信号量接口:

代码语言:javascript
复制
#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
}

这是我关心的最低限度的功能集;您的需求可能会有所不同。希望这能帮上忙。

票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27736618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档