Linuxのマルチスレッドシミュレーションの駐車場

 

する#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 ; 
}

 

おすすめ

転載: www.cnblogs.com/wanghao-boke/p/11613071.html