する#include <stdio.hに> する#include < 文字列・H> する#include <unistd.h> の#include <STDLIB.H> の#include <pthread.hの> に#define ONE_SECOND 1000000 の#define RANGE 10 の#define期間2 の#define NUM_THREADS図4 のtypedef 構造体 { INT *駐車場; // 駐車場をシミュレートする配列int型の能力を、 // 車両駐車容量INT占有; // 車両パーキングの現在の数のint nextin; // 次の着信(示さ配列添字駐車場によって表される)は、車両の位置INT nextout; // 次の車の取り外し駐車位置 のint cars_in; // 記録し、駐車場への車両の合計 int型 cars_out; // 離れた駐車場の和から車両のうち、レコード pthread_mutex_t ロック ; // ミューテックスを保護しますスレッドデータ構造を使用して相互に排他的であることが pthread_cond_tスペース; // 状態変数が利用可能な場合、駐車位置を説明し 、pthread_cond_t車 // 条件変数は駐車場かどうかについて説明 pthread_barrier_tバー; // スレッドバリア } cp_t、 静的 ボイド初期化(CPのcp_t *、int型のサイズ) { CP - > OCCUPIED = CP-> nextin = CP-> nextout = CP-> cars_in = CP-> = cars_out0 ; CP - >容量= サイズ; CP - >駐車場=(INT *)はmalloc(CP->容量* はsizeof(* CP-> 駐車場)); //はスレッドバリアを初期化する、NUM_THREADSのNUM_THREADS = 4は、スレッドの同期を待機示し実行 pthread_barrier_init(&CP-> バー、NULL、NUM_THREADS); IF(CP->駐車場== NULL) { perrorは(" のmalloc()" ); 出口(1 ); } にsrand((符号なし整数)GETPID())。 pthread_mutex_initの(&CP-> ロック、NULL); // パーキングロックの初期化 (&CP->スペース、NULL)てpthread_cond_initを; // 条件変数説明初期化するかどうかの駐車ギャップ てpthread_cond_init(&CP-> CAR、NULL); // 初期化の説明駐車場の条件かどうか変数 } 静的 無効 * car_in_handler(無効 * carpark_in) { cp_t * TEMP; 符号なし整数SEED; TEMP =(cp_t * )carpark_in; // 他のスレッドが来るまでスレッドは、作業を完了したと述べたのpthread_barrier_wait機能 pthread_barrier_wait(&temp-> バー); 一方、(1 ) { // スレッド停止期間、シミュレートされた車両のランダム性の到来 usleep(rand_r(&SEED)%のONE_SECOND) はpthread_mutex_lock(&temp-> ロック); // ループが駐車されている知っているのを待って いる間(temp-> OCCUPIED == temp-> 容量) pthread_cond_waitの(&temp->スペース、&temp-> ロック); // 乱数識別と、車両内に挿入 temp->駐車場[temp-> nextin] = rand_r(&SEED)%; RANGE TEMP - > OCCUPIED ++ ; TEMP - > nextin ++ ; TEMP - > nextin%= temp-> 定員; TEMP - > cars_in ++ ; //はtemp-送信、バスを待っている何人かの人々にことが望ましいかもしれない>車の条件変数 pthread_cond_signalを(&temp-> 車)。 pthread_mutex_unlockの(&temp-> ロック)。 } リターン((ボイド * )NULL); } 静的 ボイド * car_out_handler(ボイド * carpark_out) { cp_t * TEMP。 符号なし整数シード。 TEMP =(cp_t * )carpark_out。 pthread_barrier_wait(&temp-> バー)。 用(;;) { はusleep(rand_r(およびシード)%のONE_SECOND)。 pthread_mutex_lockの(&temp-> ロック); / * 車両が0(OCCUPIED == 0)である場合、ロックアクセスがtemp->時間の可変数を占領した後に得られる に行わpthread_cond_waitの操作はなど、多忙で、ロックが解除される(&temp->ロック)のため使用して他の経路 既知temp->条件が有する場合車ロック再び変更 * / ながら(temp-> OCCUPIED == 0 ) { pthread_cond_waitの(&temp->車&temp-> ロック;) } TEMP > occupied--を- 。 TEMP - > nextout ++ ; TEMP - > nextout%= temp-> キャパシティ; TEMP - > cars_out ++ 。 pthread_cond_signalを(&temp-> スペース)。 pthread_mutex_unlockの(&temp-> ロック)。 } リターン((ボイド * )NULL); } 静的 ボイド *(監視ボイド * carpark_in) { cp_t * TEMPと、 TEMP =(cp_t * )carpark_in。 用(;;) { 睡眠(PERIOD)。 pthread_mutex_lockの(&temp-> ロック)。 printf(" デルタ:%dは\ nを"、temp-> cars_in - temp-> cars_out - temp-> 占有)。 のprintf( " 駐車場で車の数:%dは\ nを"、temp->が占有)。 pthread_mutex_unlockの(&temp-> ロック)。 } リターン((ボイド * )NULL); } int型のmain(int型 ARGC、チャー ** ARGV) { のprintf(" メインバージョン1.0 \ n " ); もし(!ARGC = 2 ) { のprintf(" 使用法:%S carparksize \ n "、ARGV [ 0 ])。 出口( 1 )。 } cp_t outpark、 初期化(&outpark、ATOI(のargv [ 1。)]); // データ構造を初期化し、駐車 がpthread_tのcar_in、car_out、M; // 定義されたスレッドの変数 がpthread_t car_in2、car_out2; / * ** 駐車場に作成駐車スレッド(クリエータ1) 駐車場から車(消費者1)を拾うのスレッドを作成するために 駐車場(作成者2)にスレッドを作成する スレッドを作成駐車場(消費者2)から車を拾う 駐車場を監視するための条件を作成スレッド ** * / のpthread_create(&car_in、NULL、car_in_handler、(無効 *)&outpark); のpthread_create(&car_out、NULL、car_out_handler、(無効 *)&outpark)。 pthread_create(&car_in2、NULL、car_in_handler、(無効 *)&outpark); のpthread_create(&car_out2、NULL、car_out_handler、(無効 *)&outpark); のpthread_create(&M、NULL、モニター、(無効 *)&outpark); // 2番目のパラメータがNULLであるpthread_joinを、スレッドを返す状態を気にしない表し、唯一のスレッドが指定された待機終了 pthread_joinを(car_in、NULLを); pthread_joinを(car_out、NULL); pthread_joinを(car_in2、NULL); pthread_joinを(car_out2、NULL); pthread_joinを(M、NULL); 戻り 0 ; }