2009-11-17 69 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