当我使用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()也是如此。
问题:
(我确实先检查了https://apple.stackexchange.com/;没有标注/问题/加标签/c的问题,也没有关于仅推荐的系统调用程序的问题。)
发布于 2015-01-08 18:30:28
我在尝试将一个库移植到OS X时遇到了这个问题。我搜索了一段时间,没有找到一个很好的答案。当我找到答案时,我有点不安:答案实际上是“如果苹果公司实施了POSIX未命名信号量,你会购买多少X服务?”。
总结一下为什么不推荐它们以及为什么某些功能仍然未实现的原因:
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
}这是我关心的最低限度的功能集;您的需求可能会有所不同。希望这能帮上忙。
https://stackoverflow.com/questions/27736618
复制相似问题