1. スレッドの 3 つの最も重要な同期メカニズム
2. ミューテックス ロック
2. 3 つの同期メカニズムのそれぞれにラッパー クラスを実装します
3.プール
スレッドを動的に作成するのは非常に時間がかかります。スレッド プールがある場合、ユーザーのリクエストを処理するためにスレッド プールからアイドル状態のスレッドが取得され、リクエストが処理された後、スレッドはアイドル状態になります。また次回のご利用をお待ちしております。
ここでは、スレッド プール内のすべてのスレッドの ID を保存するためにベクトル コンテナーが使用されます 2. リクエスト キュー
はこちらすべてのリクエストをリストコンテナを使用して格納し、リクエストの処理は fifo
#ifdef LOCKER_H #define LOCKER_H #include <pthread.h> #include <semaphore.h> /*信号量的封装*/ class sem { public: sem() { if( sem_init( &sem_like, 0, 0)) { throw std::exception(); } } ~sem() { sem_destroy( &sem_like); } bool wait() { return sem_wait( &sem_like)== 0; } bool post() { return sem_post( &sem_like)== 0; } private: sem_t sem_like; } /*互斥锁的封装*/ class locker { public: locker() { if( pthread_mutex_init( &mutex_like,NULL) !=0) { throw std::exception(); } } ~locker() { pthread_mutex_destroy( &mutex_like); } bool lock() { return pthread_mutex_lock( &mutex_like)== 0; } bool unlock() { return pthread_mutex_unlock( &mutex_like); } private: pthread_mutex_t mutex_like; } /*条件变量的封装*/ class cond { public: cond() { if( pthread_mutex_init( &mutex_like,NULL)!= 0) { throw std::exception; } if( pthread_cond_init( &cond_like, NULL)!= 0) { //释放对应的互斥锁 pthread_mutex_destroy( &mutex_like); throw std::exception; } } ~cond() { pthread_mutex_destroy( &mutex_like); pthread_cond_destroy( &cond_like); } bool wait() { int flag= 0; pthread_mutex_lock( &mutex_like); flag= pthread_cond_wait( &cond_like, &mutex_like); pthread_mutex_unlock( &mutex_like); return flag== 0; } bool signal() { return pthread_cond_signal( &cond_like)== 0; } private: pthread_mutex_t mutex_like; pthread_cond_t cond_like; } #endif
の順序で行われます。注: 1. ここでのスレッドプールモデルでは、各スレッドがリクエストに対応します
2. このメソッドは適時性を保証しますこのモデルでは、リクエスト処理プロセスがノンブロッキングである必要がなく、1 つのリクエストの処理遅延がシステムによる他のリクエストの処理に影響を与えないため、リクエスト処理機能のパフォーマンス要件は小さくなります。もちろん、スレッドの数は動的に増加する必要があります)。
上記ではスレッド プールの実装をその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。