2009-08-18 137 views
10

在研究生課上,我們不得不使用信號量來完成線程的工作。sem_init(...):什麼是pshared參數?

我們被指示使用sem_init以及其他一些sem_ *過程,但我們沒有給出有關每個sem_ *方法的詳細信息。的sem_init

原型(和頭文件)是the following

#include <semaphore.h> 

int sem_init(sem_t *sem, int pshared, unsigned int value); 

,但我不明白pshared的值用於。根據opengroup.org

如果pshared論點有一個非零 值,則信號量進程之間共享 ;在這種情況下,任何 過程可以訪問該信號量 sem可以使用sem執行 sem_wait()sem_trywait()sem_post(), 和sem_destroy()操作。

但我想我不明白說1,2,10,25,50000等之間的區別。我認爲這是說如果該值爲0,則信號量不共享。 (但那麼,有什麼意義呢?)

我該如何恰當地使用這個pshared參數?

回答

12

glibc的版本的sem_init(你會得到什麼,如果你man sem_init在Linux上)有這樣一段話:

「pshared的參數指示此信號燈是否是 一個進程的線程之間共享,或進程之間。「

所以pshared是一個布爾值:在通過實踐有意義的值到它是false0)和true1),雖然任何非0值將被視爲正確的。如果你通過它,你會得到一個信號量,可以被同一進程中的其他線程訪問 - 實質上是一個進程內鎖。您可以將其用作互斥量,也可以更一般地將其用於信號量的資源計數屬性。可以說,如果pthreads支持信號量API,你不需要sem_init的這個特性,但是Unix中的信號量在pthreads之前會花費很多時間。

如果布爾值是某種枚舉會更好(例如SEM_PROCESS_PRIVATE vs SEM_PROCESS_SHARED),因爲那樣你就不會有這個問題了,但是POSIX信號量是一個相當舊的API。

+0

真棒回答,謝謝你的解釋。 – 2009-08-18 14:32:19

+0

非常歡迎。謝謝你的誇獎 :)。 – quark 2009-08-19 00:22:42

+0

這不是PC把這個版本稱爲屬於GLIBC。這是POSIX.1-2001。 – 2012-07-23 04:59:32

1

我想說的是,對於shared參數,值1,2和5等之間沒有顯着差異。可能是這樣寫的,因爲當API第一次創建時,C沒有布爾類型。

+0

那麼這是否使它成爲過時的API? – Sneakyness 2009-08-18 03:23:11

+0

我不知道 - 在使用較舊的「經過嘗試和測試的」API時,有時候有價值。你必須從效率和明顯的安全缺陷等角度來看它是否真的過時 – 2009-08-18 03:29:55

+0

偷偷摸摸:是和不是。沒有Pthreads,更現代的選擇,似乎沒有信號量的實現,所以對於那些需要信號量的情況下,你需要使用API​​。是的,因爲在大多數情況下,互斥和條件在代替信號量方面會取得很好的效果。 – quark 2009-08-18 03:30:47

1

pshared參數指示此信號量是在進程的線程之間還是在進程之間共享。

如果pshared的值爲0,則信號在進程的線程之間共享,並且應該位於對所有線程都可見的某個地址(例如,全局變量或動態分配的變量堆)。

如果pshared非零,那麼信號量在進程之間共享,並應位於共享內存區域(請參閱shm_open(3),mmap(2)和shmget(2))。 (由於由fork(2)創建的子代會繼承其父內存映射,因此它也可以訪問信號量。)任何可以訪問共享內存區域的進程都可以使用sem_post(3),sem_wait(3)等等在信號量上進行操作