セマフォsem_init、sem_wait、sem_post



Semaphore Sem_init Sem_wait



この記事は、主にセマフォの4つの機能の使用法を学ぶためのセマフォの簡単な紹介です。
この記事は2つの記事をまとめたものです。
http://blog.csdn.net/qyz_og/article/details/47189219
http://blog.csdn.net/ljianhui/article/details/10813469/
ありがとうございます〜

まず、セマフォとは何ですか

スレッドのセマフォは、プロセス間通信で使用されるセマフォの概念と同じです。これは増減できる特別な変数ですが、その重要なアクセスはアトミックであることが保証されています。プログラム内の複数のスレッドがセマフォの値を変更しようとすると、システムはすべての操作が順番に実行されることを保証します。



値が0と1しかないセマフォは、バイナリセマフォと呼ばれ、ここで強調表示されます。セマフォは、コードの一部が一度に1つの実行スレッドによってのみ実行されるのを防ぐためによく使用されます。これは、バイナリセマフォを使用して実行できます。

第二に、セマフォインターフェース機能

セマフォ関数はsem_で始まり、スレッドで使用される4つの基本的なセマフォ関数があります。これらはすべてヘッダーファイルsemaphore.hで宣言されています。



Sem_init関数

この関数は、プロトタイプが次のようなセマフォを作成するために使用されます。

int sem_init(sem_t *sem,int pshared,unsigned int value)
  • 1

この関数は、semが指すシグナルオブジェクトを初期化し、その共有オプションを設定して、初期整数値を与えます。
psharedは、セマフォのタイプを制御します。その値が0の場合、このセマフォが現在のプロセスのローカルセマフォであることを意味します。それ以外の場合、セマフォは複数のプロセス間で共有できます。 semの初期値です。呼び出しが成功すると0が返され、失敗すると-1が返されます。



Sem_wait関数

この関数は、セマフォの値をアトミックに1つずつデクリメントするために使用されます。アトミック操作では、2つのスレッドが同時に1つのセマフォを加算または減算しようとしても、互いに干渉しません。そのプロトタイプは次のとおりです。

int sem_post(sem_t *sem)
  • 1

semが指すオブジェクトは、sem_init呼び出しによって初期化されたセマフォです。呼び出しが成功すると0が返され、失敗すると-1が返されます。

Sem_post関数

この関数は、アトミックな方法でセマフォの値に1を加算するために使用されます。そのプロトタイプは次のとおりです。

int sem_post(sem_t *sem)
  • 1

sem_waitと同様に、semが指すオブジェクトは、sem_init呼び出しによって初期化されたセマフォです。呼び出しが成功すると0が返され、失敗すると-1が返されます。

Sem_destroy関数

この関数は、使用済みのセマフォをクリーンアップするために使用されます。そのプロトタイプは次のとおりです。

int sem_destroy(sem_t *sem)
  • 1

成功した場合は0を返し、失敗した場合は-1を返します。

第三に、セマフォの機能

コード:

#include #include #include #include #include #include sem_t sem void func1(void* arg) { sem_wait(&sem) int *running=arg printf('thread running1 ') printf('%d ',*running) } void func2(void* arg) { printf('pthread2 running ') sem_post(&sem) } int main() { sem_init(&sem,0,0) pthread_t thread[2] int a=5 pthread_create(&(thread[0]),NULL,(void*)func1,(void*)&a) printf('main thread running ') sleep(10) pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a) printf('main thread running2 ') pthread_join(thread[0],NULL) pthread_join(thread[1],NULL) sem_destroy(&sem) return 0 }
  • 1
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 十一
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 2. 3
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 3. 4
  • 35
  • 36
  • 37
  • 38
  • 39

最初にセマフォを作成します。2番目のパラメーターは0です。これは、このセマフォが現在のプロセスのローカルセマフォであり、初期値が0であることを示します。
次に、pthread_create()関数を使用して2つのスレッドを作成し、引数aを渡します。
スレッド1が作成された後、セマフォはvalue = 0を初期化するため、sem_waitを呼び出すとこのスレッドがブロックされ、セマフォ値が1減少します(この場合)。<0), this thread function will wait.
メインスレッドsleep(10)の後、スレッド2は呼び出しを作成して実行し、sem_postを使用してセマフォを1つインクリメントします。この時点で、スレッド1を実行できます。
pthread_joinを使用して、作成された2つのスレッドの終了を待ちます。

コンパイル:

gcc testSem.c -o testSem -lpthread ./testSem
  • 1
  • 3

出力:

main thread running main thread running2 pthread2 running thread running1 5

---------------------この記事はクレイジーなphpCSDNブログ、フルテキストアドレスからのものです。https://blog.csdn.net/u013457167をクリックしてください。 / article / details / 78318932?utm_source = copy