条件変数の初期化
int型てpthread_cond_init(pthread_cond_t CV *、* pthread_cond_attr cattrの); 関数の戻り値:成功時に0を返し、それ以外のリターン失敗。 パラメータ:pthread_cond_attr pthread_cond_t属性が設定するために使用され、着信値がNULLの場合、デフォルトのプロパティを示しています。
関数が戻るが、メモリに格納されて作成された条件変数は、cvが指すときは、条件変数を初期化するために、マクロPTHREAD_COND_INITIALIZERを使用することができます。それはあなたがそれが使用されていないことを確認するために、条件変数を使用したいときに、同じ条件変数、スレッドを初期化するために複数のスレッドを使用できないことは注目に値します。
条件変数を破壊します
int型 pthread_cond_destroyは(pthread_cond_t * CV); 戻り値:成功のための戻り値0は、他の値を返す失敗したことを示します。
変数の使用を条件:
int型の pthread_cond_waitの(pthread_cond_t * CV、pthread_mutex_t * ミューテックス) のint pthread_cond_signalを(pthread_cond_t * CV)。
次のように使用されます:
pthread_mutex_lockの(&ミューテックス) 一方またはIF (実行の条件スレッドが確立されている) pthread_cond_waitの(&COND、&ミューテックス)、 スレッド実行 pthread_mutex_unlockの(&ミューテックス)。
なぜロック
- プロセスでの部分的なアクセスのスレッド実行リソース、複数のスレッドが同時に実行されるスレッドが原因によるリソースの競合を避けるため、公共のリソースへの各スレッドの相互排他的なアクセスをさせるためには、それをアクセスする必要があるかもしれません。
- 条件が満たされていない場合もののや判断の実行スレッド場合は、呼び出し元のpthread_cond_waitのにスレッド自体をブロックします。、pthread_cond_waitのは自動的にミューテックスを解放する際にpthread_cond_waitの呼び出し元のスレッドがブロックされています。スレッドは、オペレーティングシステムのスレッドが待機キューに彼を入れた後、時間にpthread_cond_waitのからミューテックスコールをリリースします。
実行のスレッドを使用しながら、条件付き解放差が確立かどうかを決定します。
(消費者)の内部スレッド内のリソースの使用はリソースが利用できない、利用可能かどうかを判断するマルチスレッドのリソースの競合では、その後、これはpthead_cond_signal通話を送信します、リソースが利用可能であるかどうかを判断する(プロデューサー)内の別のスレッドでは、pthread_cond_waitのを呼び出します信号利用可能なリソース。
二つ以上のスレッドが現在のリソースを待っているがありますが、返すために待ち時間が、リソース、この場合には、使用されている可能性があるため、しかし、待って成功した後、リソースは必ずしも使用しなくてもよいです
しばらく(リソース== FALSE) pthread_cond_waitの(&指揮、&ミューテックス)。
場合は、唯一の消費者の後に、あなたがあれば使用することができます。
pthread_cond_waitの分解操作は、次の手順:
- 待機キュー上のスレッド、ロックを解除
- ロック信号またはpthread_cond_broadcastのを競争するpthread_cond_signalを待った後、
- ミューテックスは、競争の中にロックされている場合
このリソースを待っている可能性のある複数のスレッドが利用可能であり、信号は、リソースが利用可能になった後送信されるが、そこにある、B 2つのスレッドが、Bが速く、ミューテックスを取得待っている、ロック、資源の消費、 、その後、条件が行くのを待つことしばらく使用することで、その後、ミューテックスを取得した後、ロック解除したが、戻って、それが使用されているリソースを見つけ、それは二つの選択肢、存在しないリソースへのアクセスの損失を持つことになりますし、他の待機し続けることです使用後のpthread_cond_waitの戻り値であれば、他の場合は、注文が実装されます。
スレッドを待っています:
フロントpthread_cond_waitのをロックするには
内部pthread_cond_waitのロックを解除した後、他のスレッド条件変数が有効化されるのを待ちます
pthread_cond_waitのが有効化され、その後自動的にロックされます
アクティブなスレッド
ロック(と同じロックでスレッドを待っています)
pthread_cond_signalを送信信号(最終工程前の信号を待機しているスレッドかどうかを決定します)
アンロック
スレッドを実行する前に待機する時間の内部pthread_cond_waitの機能で動作し、上記の3つのアクティブなスレッド。
/ * ** pthread_if.c ** * / 書式#include <stdio.hに> する#include <SYS / types.h>に する#include <stdlib.h>に含ま 書式#include <unistd.h> の#include <pthread.hの> pthread_mutex_tミューテックス = PTHREAD_MUTEX_INITIALIZER。 pthread_cond_t指揮 = PTHREAD_COND_INITIALIZER。 int型のカウント= 0 ; ボイド *デクリメント(ボイド *の引数) { のprintf(" dermentでの\ n " ); pthread_mutex_lockの(&ミューテックス)。 もし(==カウント0 ) pthread_cond_waitの(&指揮、&ミューテックスを)。 カウント - ; printf(" ----デクリメント:%dは\ nを" 、カウント); printf(" アウトデクリメント\ nを" ); pthread_mutex_unlockの(&ミューテックス)。 リターンNULL; } ボイド *インクリメント(ボイド *の引数) { のprintf(" 増分での\ n " ); pthread_mutex_lockの(&ミューテックス)。 カウント ++ ; printf(" -----増分:%dは\ nを" 、カウント); もし(!カウント= 0 ) { pthread_cond_signalを(&指揮); } のprintf(" アウトインクリメントする\ n " ); pthread_mutex_unlockの(&ミューテックス)。 リターンNULL; } int型のmain() { がpthread_tのtid_in、tid_de。 pthread_create(&tid_de、NULL、(ボイド * )減少、NULL); 睡眠(1 )。 pthread_create(&tid_in、NULL、(無効 *)インクリメント、NULL); 睡眠(1 )。 pthread_joinを(tid_de、NULL); pthread_joinを(tid_in、NULL); pthread_mutex_destroyの(&ミューテックス)。 pthread_cond_destroyは(&指揮); リターン 0 ; }
/ * ** pthread_while.c ** * / の#include <stdio.hに> する#include <STDLIB.H> の#include <pthread.hの> する#include <unistd.h> のtypedef 構造体node_s { int型のデータ、 構造体 * node_s 次。 } node_t。 node_t *ヘッド= NULL; pthread_mutex_tミューテックス = PTHREAD_MUTEX_INITIALIZER。 pthread_cond_t指揮 = PTHREAD_COND_INITIALIZER。 空 cleanup_handler(ボイド *の引数) { のprintf("cleanup_handlerが実行されます。\ n " ); フリー(引数); pthread_mutex_unlockの(&ミューテックス); } ボイド * thread_func(ボイド * 引数) { node_tの *はP = NULL; は、pthread_cleanup_push(cleanup_handler、p)を、 一方(1 ) { (pthread_mutex_lockの&ミューテックス); 一方、(NULL == ヘッド) pthread_cond_waitの(&COND、&ミューテックス); P = ヘッドと、 ヘッド =頭部>次。 printf(" プロセス%dのノードを\ n "、P-> データ)。 無料(P); pthread_mutex_unlockの(&ミューテックス)。 } は、pthread_cleanup_push(0 )。 リターンNULL; } int型のmain() { がpthread_tのTID。 node_t * TEMP = NULL; int型私は、 pthread_create(&TID、NULL、(ボイド * )thread_func、NULL); 用(i = 0 ; iは< 10 ; iは++ ) { TEMP=(node_t *)はmalloc(はsizeof (node_t))。 一時 - >データ= I; pthread_mutex_lockの(&ミューテックス)。 TEMP - >次= ヘッド。 ヘッド = 温度; pthread_cond_signalを(&指揮); pthread_mutex_unlockの(&ミューテックス)。 睡眠(1 )。 } のpthread_cancel(TID)。 pthread_joinを(TID、NULL); リターン 0 ; }