アプリケーション例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