2009-08-18 25 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_wait()sem_trywait()sem_post()、 とsem_destroy()動作を実行するためsemを使用することができます。

私は1,2,10,25,50000などの違いを理解していないと思いますが、値が0の場合はセマフォが共有されていないと思います。 (しかし、そのポイントは何ですか?)

このpsharedパラメータを適切に使用するにはどうすればよいですか?

答えて

12

sem_initのGLIBCバージョン、これは言っている(あなたがLinux上man sem_initがあれば何を得る):

「引数psharedはこのセマフォは、プロセスのスレッド間で共有 するかどうかを示し、またはプロセス間で。

だからpsharedはブール値である:任意の非0値が真として扱われても、実際に渡された意味のある値は、false0)とtrue1)です。 0を渡すと、同じプロセス内の他のスレッドからアクセスできるセマフォーが得られます。基本的にはインプロセスロックです。これをmutexとして使用することも、より一般的にはセマフォのリソースカウントプロパティに使用することもできます。おそらく、pthreadsがセマフォーAPIをサポートしていたとしても、この機能はsem_initは必要ありませんが、Unixのセマフォーはかなり時間がかかります。

ブール値が何らかの種類の列挙型(例:SEM_PROCESS_PRIVATESEM_PROCESS_SHARED)だった方がよいでしょう。なぜなら、この質問はありませんでしたが、POSIXセマフォはかなり古いAPIなのです。

+0

恐ろしい答え、説明をありがとう。 –

+0

あなたは大歓迎です。お褒めの言葉をありがとうございます :)。 – quark

+0

このバージョンをGLIBCに所属していると呼ぶのはPCではありません。それはPOSIX.1-2001です。 –

1

sharedパラメータに関して、値s 1,2,5などの間に大きな違いはないと言います。おそらくそれはAPIが最初に作成されたときにCがブール型を持たなかったからです。

+0

それは古いAPIにしていますか? – Sneakyness

+0

私は気にしません - 時には古い「試されテストされた」APIを使用する価値があります。それが実際に時代遅れであるかどうかを言うために、効率性や明らかなセキュリティ上の欠陥などの観点から見る必要があります。 –

+0

Sneakyness:はい、いいえ。いいえ、Pthreadsは、より現代的な選択では、セマフォ実装を持たないように見えるので、使用する必要があるAPIであるセマフォを必要とする場合には、はい、ほとんどの場合、mutexと条件はセマフォの代わりにうまくいくでしょう。 – quark

1

pshared引数は、このセマフォをプロセスのスレッド間で共有するか、プロセス間で共有するかを指定します。

psharedが値0を持つ場合、セマフォはプロセスのスレッド間で共有され、すべてのスレッドに見えるいくつかのアドレスに配置する必要があります(グローバル変数、ヒープ)。

psharedが0以外の場合、セマフォはプロセス間で共有され、共有メモリの領域に配置する必要があります(shm_open(3)、mmap(2)、およびshmget(2)を参照)。 (fork(2)によって作成された子は親のメモリマッピングを継承するので、セマフォにもアクセスできます)。共有メモリ領域にアクセスできるプロセスは、sem_post(3)、sem_wait(3)などを使ってセマフォに対して操作できます。

関連する問題