はじめに
このプロジェクトでは、マルチスレッド環境で文字列を印刷する際にミューテックスを使用して同期をとる方法を学びます。既存の「混沌としたタイプライター」プログラムを修正して、文字列が正しい順序で印刷され、文字が混ざり合わないようにします。
👀 事前確認
$ gcc printer.c -o printer -lpthread
$./printer
helloworld
🎯 タスク
このプロジェクトでは、以下を学びます。
init()関数でミューテックスを初期化する方法printer()関数でミューテックスをロックおよびアンロックして、印刷プロセスへの排他的なアクセスを確保する方法- 修正したプログラムをコンパイルおよび実行して、正しい出力を観察する方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- マルチスレッドプログラムにおける共有リソースへのアクセス同期におけるミューテックスの重要性を理解する
- ミューテックスのロックおよびアンロック技術を適用して、複数のスレッドの実行を調整する
- マルチスレッドプログラムのトラブルシューティングと問題の修正を行って、目的の出力を得る
ミューテックスを初期化する
このステップでは、init() 関数でミューテックスを初期化する方法を学びます。以下の手順に従ってこのステップを完了しましょう。
/home/labex/project/ディレクトリにあるprinter.cファイルを開きます。- 既に関数
printerに与えられているコードでは、印刷プロセスへの排他的なアクセスを確保するために、最初にミューテックスがロックされています (pthread_mutex_lock(&mutex))。文字列が完全に印刷されると、ミューテックスがアンロックされ (pthread_mutex_unlock(&mutex))、他のスレッドが印刷できるようになります。 init()関数を見つけて、ミューテックスを初期化するために以下のコードを追加します。
void init()
{
pthread_mutex_init(&mutex, NULL);
}
これは、POSIX スレッド (pthreads) ライブラリの一部である pthread_mutex_init() 関数を使用して mutex 変数を初期化します。2 番目の引数 NULL は、デフォルトのミューテックス属性を使用していることを指定します。
プログラムをコンパイルして実行する
これで、printer.c ファイルの修正が完了したので、プログラムをコンパイルして実行できます。
- ターミナルを開き、
/home/labex/project/ディレクトリに移動します。 - pthreads ライブラリをリンクするために
-lpthreadフラグでプログラムをコンパイルします。
gcc printer.c -o printer -lpthread
- プログラムを実行します。
./printer
このとき、以下の出力が表示されるはずです。
helloworld
予想通り、文字列 "hello" と "world" が順番に印刷され、文字が混ざり合うことはありません。
おめでとうございます!あなたは「混沌としたタイプライター」プログラムを意図通りに動作させるように成功裏に修正しました。
まとめ
おめでとうございます!このプロジェクトを完了しました。あなたは実験 (Lab) をもっと練習することができ、あなたの技術を向上させることができます。



