Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linuxスレッドのセマフォ同期

Linuxスレッドのセマフォ同期

  

セマフォとミューテックスの違い:ミューテックスでは1つのスレッドしかクリティカルセクションに入ることができませんが、セマフォでは複数のスレッドが同時にクリティカルセクションに入ることができます。

これ以上の説明は必要ありません。セマフォ同期を使用するには、ヘッダーファイルsemaphore.hをインクルードする必要があります。

主に使用される関数:

  • int sem_init(sem_t * sem、int pshared、unsigned int value);、semは初期化されるセマフォ、psharedはシグナルです。量がプロセス間で共有されているかスレッド間で共有されているかにかかわらず、valueはセマフォの初期値です。
  • int sem_destroy(sem_t * sem);、semは破棄するセマフォです。 sem_initで初期化されたセマフォだけがsem_destroyで破壊されます。
  • int sem_wait(sem_t * sem);セマフォの値が0より大きい場合は、セマフォの値を1減らしてすぐに戻ります。セマフォの値が0の場合、スレッドはブロックされています。 P操作に相当します。正常に0を返し、失敗で-1を返します。
  • int sem_post(sem_t * sem);セマフォを解放し、セマフォを1つインクリメントします。 V動作に相当します。

    次のコードは、セマフォ同期を使用してウィンドウサービスシステムをシミュレートする方法を示しています。

     /* @purpose:セマフォに基づくマルチスレッド同期、オペレーティングシステムの原則におけるP、V操作* @author:[email protected] * @create:2015-03-20 Fri * * /#include< pthread.h> #include< semaphore.h> #include< unistd.h> #include< stdio.h> #include< stdlib.h> /* @Scene:同時に業界のビジネスホール2人の顧客だけに役立つことができます。 *複数の顧客が来る場合、各顧客は、サービスウィンドウがいっぱいになったと判断すると待機します。*利用可能なサービスウィンドウがある場合は、サービスを受け入れます。 * //*複数のスレッドによる* /sem_t semの共有を容易にするためにグローバル変数としてセマフォを定義する; /*スレッドごとに実行されるルーチン* /void * get_service(void * thread_id){/*注:thread_idを直ちに保存するthread_idはメインスレッド内のループ変数iへの参照であるため、この値は直ちに変更される可能性があります* /int customer_id = *((int *)thread_id); if(sem_wait(& sem)== 0){usleep( 100); /*サービス時間:100ms * /printf( "customer%dサービスを受けています... \\ n"、customer_id); sem_post(& sem);}}#define CUSTOMER_NUM 10int main(int argc、char *) Argv []){/*セマフォを初期値2で初期化します。これは、2人の顧客が同時にサービスを受けることができることを示します。* //* @prototype:int sem_init(sem_t * sem、int pshared、unsigned int value); * //* pshared:pshared == 0の場合、セマフォはプロセスのスレッド間で共有されます*それ以外の場合、セマフォはプロセス間で共有されます* /sem_init(& sem、0、2); /*各顧客のスレッドIDを定義しますpthread_tは実際には符号なしLong int * /pthread_t顧客[CUSTOMER_NUM]; int i、ret; /*(i = 0; i コンパイル:gcc main.c -lpthread。 

    実行結果(実行ごとに異なります):

    顧客0が到着しました。顧客1が到着しました。顧客0はサービスを受けます...顧客2が到着しました。顧客1はサービスを受けます.. 。顧客3が到着しました。顧客2がサービスを受け取りました...顧客4が到着しました。顧客3がサービスを受け取りました...顧客5は到着しました。顧客4はサービスを受け取りました...顧客6は到着しました。 6サービスを受ける...顧客8が到着しました。顧客7はサービスを受け取ります...顧客9は到着しました。顧客8はサービスを受け取ります...顧客9はサービスを受け取ります...
    						
  • Copyright © Windowsの知識 All Rights Reserved