セマフォライトボックスコードミューテックスのコード例

アプリケーション例Linuxのミューテックス

これは、2つのスレッド間のミューテックス同期の使用の一例である/ *、* /つのスレッドは、標準的な入力装置からデータを読み出すための責任があり、そして他のスレッドは、標準的な出力デバイスへの出力データを読み出すための責任がある
#含まに<stdio.h>
の#include <unistd.h>
の#include <STDLIB.H>
の#include <pthread.hの>
する#include <semaphore.h>
の#include <string.hの>

ボイド*のthread_function(ボイド*アルギニン);

pthread_mutex_t work_mutex; //グローバルミューテックスオブジェクトが最初にそのようなミューテックス定義する必要

1024個の//グローバル共有データの#define WORK_SIZEを
[WORK_SIZE] work_areaチャー;
INT time_to_exit = 0;

int型のmain(int型ARGC、CHAR * ARGV [])
{
    int型RES;
    がpthread_tのa_thread;
    ボイド* thread_result;
    RES = pthread_mutex_initの(&work_mutexは、NULLは); // INITミューテックスミューテックスを初期化
    !IF(RES = 0)
    {
        perrorは( "ミューテックスの初期化に失敗しました");
        出口(EXIT_FAILURE)。
    }
    RES =のpthread_create(&a_thread、NULL、thread_function、NULL); //は、新しいスレッドを作成创建新线程
    (RES = 0!)の場合
    {
        perrorは( "スレッドの作成に失敗しました");
        出口(EXIT_FAILURE)。
    }
    pthread_mutex_lockの(&work_mutex)。//ミューテックスをロック互斥锁上锁
    のprintf( "入力テキストを\ n個を終了する'末端'を入力します。");
    しばらく(time_to_exit!)//标志
    {
        関数fgets(work_area、WORK_SIZE、STDIN); //標準入力读取一行信息から文字列を取得
        pthread_mutex_unlockの(&work_mutexを)。//解锁ミューテックスのロックを解除
        しながら(1)
        {
                 pthread_mutex_lockの(&work_mutex); //ミューテックスロック
                    (!work_area [0] = '\ 0')IFをコンテンツ出力読んでいないチェック//
               {
                           pthread_mutex_unlockの(&work_mutexを); // UNLOCKミューテックスは、出力、アンロックされていない場合
                           、睡眠( 1);
                       }
                    他
            {
                    BREAK;
                        }
                }
         }
    pthread_mutex_unlockの(&work_mutex); //ロックを解除
    のprintf( "完了するためのスレッドのために\ nWaitingを... N- \");
    RES = pthread_joinを(a_thread、&thread_result); //別のを待ちます端スレッド
    IF(RES!= 0)
    {
        perrorは( "スレッド参加失敗"を);
        出口(EXIT_FAILURE);
    }
    のprintf( "N- \スレッドに参加しました");
    pthread_mutex_destroyの(&work_mutex); //ミューテックス破壊
    終了(EXIT_SUCCESSを);
}

void *型thread_function(void *型のArg)
{
    SLEEP(1);
    pthread_mutex_lockの(&work_mutex); //ロックされたリソースのプリエンプション
    ながら(!strncmpは( "終了" 、work_area、3)= 0)// 終了情報が決定されていない端
    {
        のprintf(「%INPUT DユーによってN \文字」、(work_area strlenを ;)-1) 自信の終わり、その後とき//入力文字の数を出力
        %S文字は、 "work_areaある)(printfの"; //出力文字コンテンツ入力
        work_area [0を] = '\ 0'; //その最後の"\ 0"に設定
        pthread_mutex_unlockの(&work_mutex)。ロック解除が完了した後//出力
        睡眠(1)。
        pthread_mutex_lockの(&work_mutex); //ロック
        (work_area [0] == 'ながら \ 0')// 最初の判定ではないが\ 0
        {
            pthread_mutex_unlockの(&work_mutex); //ロック解除待つ
            SLEEPを(1);
            pthread_mutex_lockの( &work_mutex); //再びロックループ
        }
    }
    time_to_exit = 1; //設定終了フラグ
    work_area [0] = '\ 0';
    pthread_mutex_unlockの(&work_mutex)
    pthread_exit(0);
}

カテゴリー:  LINUX / UNIX

おすすめ

転載: blog.csdn.net/weixin_40654382/article/details/88358110