C の POSIX セマフォ

C No Posix Semafo



「すべてのプログラミング言語には特定の目的のための多くのライブラリがありますが、C の POSIX ライブラリにはその場所があります。プロセス間で大きな調和を生み出すように設計されており、プログラム内でマルチスレッドを使用するのに大いに役立ちます。つまり、複数のスレッドを作成してそれらの実行を同期させます。今日のこのガイドでは、C で POSIX セマフォを使用する簡単な図を示します。基本的な C コードの例については、システムでそのコンパイラを構成する必要があります。ただし、その前に、システムを更新する必要があります。これは、コードをスムーズに実行するために必要なステップであるためです。したがって、添付のスナップに表示されるクエリは、「apt」ユーティリティを使用して Linux オペレーティング システムを更新およびアップグレードするために必要なものです。」


このプロセスでは、更新をスムーズに実行するために、Linux プラットフォームに約 55 KB のスペースが必要でした。それだけのスペースを与えても構わない場合は、「y」をタップして続行します.処理は数分で完了します。








システムが完全にアップグレードされたら、「install」コマンドの apt-get ユーティリティを使用して、システムに C 言語のコンパイラを構成します。 「gcc」をキーワードとして使用するだけです。





sem_init()

「s」に未識別のセマフォがすでに存在する場合、新しいセマフォが作成されます。そうしないと、既存のセマフォが破棄されます。このメソッド全体で、「s」は構築されたセマフォ インスタンスを表し、shared は、セマフォを forked() メソッドまたはその他の方法で配布できるかどうかを示すシグナルまたはペナントです。入力値は、セマフォの設定開始点として機能します。





int sem_init ( nor_t * s、int 共有、unsigned int 値 ) ;

Sem_wait()

sem_wait() メソッドは、s で指定されたセマフォに対してセマフォ ロック アクションを実行することにより、そのセマフォを保持します。 sem-wait プロシージャは、セマフォを保持するか、列に並べるために使用されます。以前にオーバーロードされたプロセスの一部は、他のプロセスが sem_post() を呼び出したときに起動します。



int sem_wait ( nor_t * s ) ;

no_post()

sem post が呼び出されると、値が増加し、以前にバックアップされた操作または待機中の操作の 1 つが実行を開始します。つまり、既にロックされているセマフォのロックを解除します。

int sem_post ( nor_t * s ) ;

no_destroy()

初期化された名前のないセマフォ「s」は、sem destroy() 関数を使用して破棄されます。

int sem_destroy ( nor_t * s ) ;

セマフォを理解するために、まず C ファイルを作成し、次にコードを追加します。作成するには、「タッチ」クエリを使用すると、システムのホーム フォルダーに新しいファイルが見つかります。


ここで、空の C ファイルを単純なエディターで開いて、適切なコードを生成する必要があります。下のスナップに示すように、これまで「nano」エディターを試してきました。


これらのライブラリには、システム全体の動作に使用される多数のクラス、構造、関数、およびオブジェクトが含まれているため、すべてのプログラミング言語はライブラリなしでは機能しないことは誰もが知っていることです。そこで、POSIX セマフォ用のいくつかの基本的で必須のライブラリーを使用して、この C プログラムを開始します。

コードでこれらのライブラリを使用するには、各ライブラリのキーワード「include」で「#」文字を使用する必要があります。現在、このプログラムに必要な合計 4 つのライブラリを追加しています。そうしないと、プログラムが正しく動作しません。最初の「stdio.h」ヘッダー ライブラリは、通常、すべての C プログラムで必須です。これにより、コード内で入出力操作が可能になるからです。したがって、入力をスムーズに追加し、コードから出力を取得するために使用しています。ここで使用している 2 つ目のライブラリは、スレッド プログラミング、つまりマルチスレッドを使用するために必要な「pthread.h」です。

このライブラリを使用して、プログラム内にスレッドを作成します。このコードで次に重要なライブラリは「semaphore.h」です。スレッドをスムーズに同期するために利用されています。最後になりましたが、ライブラリは「unistd.h」であり、ユーザー定義のその他の関数と定数を使用できるようにします。これで、セマフォ ライブラリの組み込みオブジェクト「sem_t」を使用して「s」セマフォを宣言しました。ここでは、戻り値の型のないスレッド ユーザー定義関数「T」が来ます。組み込みのセマフォ関数を使用して同期を実行しています。 sem_wait() 関数は、「&」文字を使用してセマフォ「s」を保持するためにここにあります。

保留中に、printf() ステートメントが「sleep」関数とともに実行され、このプログラムが 4 秒間スリープ状態になりました。別の printf() ステートメントが新しいメッセージを表示し、sem_post() 関数が実行されてセマフォ「s」のロックが解放されます。

#include
#include
#include
#include
どちらもありません。
空所 * T ( 空所 * 引数 ) {
sem_wait ( & s ) ;
printf ( 'いらっしゃいませ! \n ' ) ;
寝る ( 4 ) ;
printf ( 'さよなら! \n ' ) ;
sem_post ( & s ) ;
}



セマフォ用のこの C プログラムの main() メソッドをよく見てみましょう。ここでは、sem_init() 関数を使用して、forked() メソッドで配布されていない新しいセマフォ「s」、つまり「0」を作成し、その開始点を 1 に設定しています。 pthread からの pthread_t オブジェクトC のライブラリを使用して、2 つのスレッド オブジェクト o1 と o2 を使用して 2 つのスレッドを作成しました。 printf() ステートメントは、次の行で pthread_create() 関数を使用して最初のスレッドを作成することを示しています。

o1 スレッド オブジェクトを NULL 制限付きでこの関数に渡し、パラメータで渡すことによって関数「T」を呼び出しています。 4 秒間スリープした後、別のスレッドがオブジェクト o2 で作成され、ここで pthread_join() 関数を使用してスレッドを main() 関数で結合します。 sem_destroy() 関数は、「s」セマフォを破棄するためにここにあり、ブロックされたスレッドもすべて解放されます。

int メイン ( ) {
sem_init ( & s、 0 1 ) ;
pthread_t o1、o2;
printf ( 「現在、第 1 スレッドで... \n ' ) ;
pthread_create ( & o1、NULL、T、NULL ) ;
寝る ( 4 ) ;
printf ( 「現在、第 2 スレッドで... \n ' ) ;
pthread_create ( & o2、NULL、T、NULL ) ;
pthread_join ( o1、NULL ) ;
pthread_join ( o2、NULL ) ;
no_destroy ( & s ) ;
戻る 0 ;
}



「Gcc」コンパイラで C プログラムをコンパイルしています。 「-lrt」および「-lpthread」オプションは、POSIX スレッド関数の実行に使用されます。 「.a/.out」クエリを実行すると、最初のスレッドが作成されました。最初のメッセージを出力した後、スリープ状態になります。


2 番目のスレッドが同期され、4 秒後に最初のスレッドが解放され、2 番目のスレッドが 4 秒間ロックされました。


最後に、2番目のスレッドもリリースされました。

結論

C の POSIX セマフォについては以上です。主な機能のいくつかを利用してさまざまなスレッドを同期します。この記事を読み進めると、POSIX の理解が深まります。