2010-08-10 73 views
0

我是MAC/OSX的新蜜蜂。我正在研究Titanium跨平台运行时,它为大多数可移植的C++ API使用POCO库。我发现POCO在OSX上为其NamedMutex实现使用POSIX信号量,而不是SysV信号量,它在其他* NIX中使用。为什么POCO选择使用OSX的Posix信号量?

bool NamedMutexImpl::tryLockImpl() 
{ 
#if defined(sun) || defined(__APPLE__) || defined(__osf__) || defined(__QNX__) || defined(_AIX) 
return sem_trywait(_sem) == 0; 
#else 
struct sembuf op; 
op.sem_num = 0; 
op.sem_op = -1; 
op.sem_flg = SEM_UNDO | IPC_NOWAIT; 
return semop(_semid, &op, 1) == 0; 
#endif 
} 

对于一些搜索,我看到的SysV为sem_ * API的支持OSX,以及:http://www.osxfaq.com/man/2/semop.ws。任何想法,为什么POCO开发人员选择在OSX上使用POSIX API?

我特别在上面的调用中使用了SEM_UNDO功能,这是POSIX信号量不能给出的。

+0

我想冒险猜测,因为OSX植根于BSD,它在SysV发生之前从UNIX树分支出来,因此对于OSX POSIX可能比SysV更接近本机。 – m1tk4 2010-08-13 19:07:27

回答

1

任何想法,为什么POCO开发人员选择在OSX上使用POSIX API?

对于POCO开发者来说,这似乎是一个相当武断的决定:两个信号灯都不能真正匹配Windows的命名信号量(之后它们显然是精心设计的)。 POSIX上没有信号量,它有自己的符号名称空间,类似于文件系统。 (SysV sems的命名空间由整型id组成,但没有符号名称。)

如果发布的代码确实来自库,我只能建议停止依赖库来实现可移植性。那么,至少在信号量方面,你显然已经开始自己的实现了。

编辑1。检查信号量是如何针对Windows实现的。这些库使用Windows的关键部分是很常见的。然后POSIX sem_t是一个合适的匹配。只有在信号量被多个进程访问时才需要SEM_UNDO - 它不适用于线程。即当进程崩溃时,撤消会发生。尽管在Linux上他们使用SysV的事实相当令人担忧。 SysV信号量是全局的,因此操作系统的限制(可以在运行时更改)其数量 - 而sem_t信号量是进程本地的,只是私有内存中的结构,并且仅受限于本地内存进程的数量分配。

P.S.勉强。真正的原因可能是POCO的主要开发发生在Windows上(通常是“便携式库”;它们“可移植到Windows”,所以试图使* NIX看起来像Windows)。 UNIX实现往往是事后才想到的,由几米之外的人看到了终端屏幕,并且从未读过函数原型的更多手册页。这是我过去对几个这样的“便携式图书馆”的个人体验。

+0

是的,对于我使用的用例,我需要信号量跨进程访问,并在退出时进行清理(包括崩溃) – wanderer 2010-08-23 07:46:29