1.タスク:端末から任意の文字のユーザ入力と表示される文字の数、入力端の端を数えます
2.マルチスレッド:メインスレッドは、ユーザ入力を取得し、サブスレッドカウントを終了するか否かを判断します
1つの#include <stdio.hの> 2の#include < 文字列・H> 3の#include <STDLIB.H> 4の#include <pthread.hの> 5の#include <semaphore.h> 。6 。7 チャー BUF [ 200は = {] 0 }; 8 sem_t SEM; 9 ボイド * FUNC(ボイド * アルギニン); 10 // サブスレッドのプログラム、統計の役割は、文字や印刷BUFの数である 11。 ボイド * FUNC(ボイド * のArg) 12は 、{ 13は // 子スレッド最初に起動メインスレッドを待っている間、ループに遮断するサイクルを有するべきである; 14 //BUFの文字長を取得するサブスレッドを活性化された後、次に、印刷、印刷後に再び遮ら 15 sem_wait(&のSEM)を、 16 ながら(strncmpは(BUF、「終了」、3。 )!= 0 ) 17 { 18であります printf(" N- \%d文字を入力する" 、(BUF)strlenを) 。19 のmemset(BUF、0、はsizeof (BUF)); 20は sem_wait(&からSEM); 21れる } 22は、 pthread_exit(NULL); 23である } 24 25 INTメイン(無効) 26は、 { 27 のint RET = - 1 ; 28 がpthread_t TH = - 1。; 29 30 sem_init(&SEM、0、0 ); 31である 32 RET =のpthread_create(&TH、NULL、FUNC、NULL); 33は、 IF(RET =!0 ) 34である { 35 のprintf(" pthread_createのエラーの\ n " ); 36 終了( - 1 ); 37 } 38は、 39 のprintf(" 文字を入力してください、キャリッジリターン\ nを" ); 40 ながら(scanfの(" %S "BUF)) 41である { 42れる// ユーザー入力がある場合、出口次いで、端であるか否かを判定し、そうでない場合、43はIF!(strncmpは(BUF、" 終了" 3 )) 44 { 45 // 入力端である46である のprintf(" プログラム\のN-末端' ;) 47 sem_post(&SEM); // 活性化セマフォ48 BREAK ; 49 } 50 // メインスレッドはユーザを受け取ります入力文字列と確認がない終了後、シグナル活性化スレッド数を行きます 51 // 子スレッドがブロックされ、メインスレッドを起動することができ、そのスレッドの同期で 52の // セマフォは、この同期スレッド達成するために使用することができる 53れる sem_post(&SEM); // 起動セマフォ 54は、 55 } 56である 57れる // サブスレッド回復 58に (のprintf "\ N-子スレッドの回復を待っている" ); 59 RET = pthread_joinを(TH、NULL); 60 のIF(RET =!0 ) 61である { 62です (printfの" N- \ pthread_joinをエラー。" ); ている63 出口( - 1 ); 64 } 65 のprintf(" N- \子スレッド復旧成功。" ); 66 67 sem_destroy(&SEM); 68 リターン 0 ; 69 }