2009-11-17 70 views
1

我将一个Windows应用程序移植到Linux,并且我有一个同步问题。Linux进程间可重入信号量

在Windows中,我使用系统级名为mutex来同步对共享内存块的访问。

我该如何在Linux中进行模拟?我用semget创建了一个SystemV信号量。问题是,它不是可重入的,如果我已经拥有它,它将会阻塞,不像在Windows上。我可以为它添加一个引用计数,但是接下来我需要同步访问,这意味着另一个(仅限当前进程)互斥量。

是否有一个类提供了一个可重入的进程间锁定(可能在升压)?

顺便说一句,使用文件锁定是不可接受的,因为它可能会太慢(我需要两个进程之间的超低延迟通信)。

+0

引用计数大概是每个线程,所以如果你使用原子操作来递增/递减它,你不需要同步对它的访问。 – atomice 2009-11-17 14:13:35

回答

6

您可以只使用一个共享(间),递归pthread_mutex_t。创建一个普通的pthread_mutex(存储在共享内存中),并使用pthread_mutexattr_settypePTHREAD_MUTEX_RECURSIVE标志设置其属性,然后使用PTHREAD_MUTEX_SHARED标志调用pthread_mutexattr_setpshared

这会给你一个可重入的进程间锁。

+0

在共享内存中存储互斥量并不理想。但是,如果我找不到更好的东西,我想我将不得不继续这样做。 – Meh 2009-11-17 14:15:02

+0

你别无选择。互斥量必须存储在共享内存中,如果你希望它是进程间的话。 – 2009-11-17 14:15:58

+0

boost :: interprocess :: named_recursive_mutex似乎就是这样做的。我会给你答案的,因为指向boost :: interprocess :: named_mutex的其他答案已经消失(即使它不是递归的)。 – Meh 2009-11-17 15:32:56

1

你可以尝试建立你自己的futexes。请参阅this tarball中的usersem.c。

+0

我也需要这个端口类似于Windows CRITICAL_SECTION的东西,而futex似乎就是这样。问题是,futex似乎还没有一个锁定/解锁简单的API使用,从我看到它不是微不足道的使用(大量的陷阱,你可以陷入)。而且由于我的Linux fu还不是很好,现在我坚持使用更简单的原语。 – Meh 2009-11-17 13:40:52