2010-02-17 49 views
3

我有一個包含一些數據的共享內存塊。讀取/寫入這些數據需要在不同的過程之間進行同步。此刻,我使用了未命名的POSIX信號量。 因爲我主要關心的是速度,所以我想知道信號量在這裏是否最優?例如,它們以系統調用結束(用戶空間 - >內核空間)還是強制上下文切換? 你會建議什麼?快速進程間同步方法

上無名信號量的一些信息:http://linux.die.net/man/3/sem_init

回答

2

由於不同的進程有不同的地址空間,任何同步功能將不得不通過內核......除非你設法通過共享內存塊同步。而你恰好有這樣的一塊。

因此,我建議使用位於共享內存塊中某處的pthreads互斥鎖(請參閱pthread_mutex_lock())。這將適用於最新的Linux系統(glibc-2.3.2或更高版本,內核2.6.x)。有了互斥鎖,只有在爭用時纔會調用內核(兩個進程爭奪相同的鎖),在這種情況下,通過內核是正確的。

+0

位於共享內存空間的原子變量/螺旋鎖怎麼樣? pthread_mutex更好嗎? – monkey 2010-02-18 07:30:45

+1

原子變量和自旋鎖做了一半的工作;有時這是足夠的。一個互斥鎖以一個自旋鎖開始,但是如果該鎖已經被另一個實體擁有,則'pthread_mutex_lock()'將調用內核等待鎖釋放。原始的自旋鎖通常會以忙等待結束,即在阻塞時使用CPU。 – 2010-02-18 14:37:22

+1

需要注意的是,默認情況下,一個pthread互斥鎖「只會在與初始化互斥鎖的線程相同的進程內創建的線程上運行」。使用pthread_mutexattr_setpshared(http://goo.gl/PjHHEI)更改此行爲。 – 2013-12-08 01:45:50