ミューテックスを使ってマルチスレッド印刷を同期させる

CBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、マルチスレッド環境で文字列を印刷する際にミューテックスを使用して同期をとる方法を学びます。既存の「混沌としたタイプライター」プログラムを修正して、文字列が正しい順序で印刷され、文字が混ざり合わないようにします。

👀 事前確認

$ gcc printer.c -o printer -lpthread
$./printer
helloworld

🎯 タスク

このプロジェクトでは、以下を学びます。

  • init() 関数でミューテックスを初期化する方法
  • printer() 関数でミューテックスをロックおよびアンロックして、印刷プロセスへの排他的なアクセスを確保する方法
  • 修正したプログラムをコンパイルおよび実行して、正しい出力を観察する方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • マルチスレッドプログラムにおける共有リソースへのアクセス同期におけるミューテックスの重要性を理解する
  • ミューテックスのロックおよびアンロック技術を適用して、複数のスレッドの実行を調整する
  • マルチスレッドプログラムのトラブルシューティングと問題の修正を行って、目的の出力を得る

ミューテックスを初期化する

このステップでは、init() 関数でミューテックスを初期化する方法を学びます。以下の手順に従ってこのステップを完了しましょう。

  1. /home/labex/project/ ディレクトリにある printer.c ファイルを開きます。
  2. 既に関数 printer に与えられているコードでは、印刷プロセスへの排他的なアクセスを確保するために、最初にミューテックスがロックされています (pthread_mutex_lock(&mutex) )。文字列が完全に印刷されると、ミューテックスがアンロックされ (pthread_mutex_unlock(&mutex) )、他のスレッドが印刷できるようになります。
  3. init() 関数を見つけて、ミューテックスを初期化するために以下のコードを追加します。
void init()
{
    pthread_mutex_init(&mutex, NULL);
}

これは、POSIX スレッド (pthreads) ライブラリの一部である pthread_mutex_init() 関数を使用して mutex 変数を初期化します。2 番目の引数 NULL は、デフォルトのミューテックス属性を使用していることを指定します。

プログラムをコンパイルして実行する

これで、printer.c ファイルの修正が完了したので、プログラムをコンパイルして実行できます。

  1. ターミナルを開き、/home/labex/project/ ディレクトリに移動します。
  2. pthreads ライブラリをリンクするために -lpthread フラグでプログラムをコンパイルします。
gcc printer.c -o printer -lpthread
  1. プログラムを実行します。
./printer

このとき、以下の出力が表示されるはずです。

helloworld

予想通り、文字列 "hello" と "world" が順番に印刷され、文字が混ざり合うことはありません。

おめでとうございます!あなたは「混沌としたタイプライター」プログラムを意図通りに動作させるように成功裏に修正しました。

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたは実験 (Lab) をもっと練習することができ、あなたの技術を向上させることができます。

✨ 解答を確認して練習✨ 解答を確認して練習