セマフォとミューテックスの違い:ミューテックスでは1つのスレッドしかクリティカルセクションに入ることができませんが、セマフォでは複数のスレッドが同時にクリティカルセクションに入ることができます。
これ以上の説明は必要ありません。セマフォ同期を使用するには、ヘッダーファイルsemaphore.hをインクルードする必要があります。
主に使用される関数:
次のコードは、セマフォ同期を使用してウィンドウサービスシステムをシミュレートする方法を示しています。
/* @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はサービスを受け取ります...
長い間ubuntuを使用してきた人々、多くの人々が突然ヒントを出します。ディスク容量は1G未満です。それから長い間分析しなさい。 。最近同様の問題が発生した、レコードは次のとおりです
を忘れてしまったルートパスワードを忘れてしまった、あなたがそのような状況に遭遇した場合はどうなりますか?システムを再インストールしますか?もちろん違います!シングルユーザーモードに入り、rootパスワ
エフェクト達成される: 2つのサーバー:&QUOT; 192.168.201.236&quot;および&quot; 192.168.201.237&QUOT;達成する必要:サーバー&