スレッドプールを実装する

WBOY
リリース: 2016-07-29 08:55:39
オリジナル
2893 人が閲覧しました

1. スレッドの 3 つの最も重要な同期メカニズム

2. ミューテックス ロック

2. 3 つの同期メカニズムのそれぞれにラッパー クラスを実装します

3.プール

スレッドを動的に作成するのは非常に時間がかかります。スレッド プールがある場合、ユーザーのリクエストを処理するためにスレッド プールからアイドル状態のスレッドが取得され、リクエストが処理された後、スレッドはアイドル状態になります。また次回のご利用をお待ちしております。


2 つのコア データ構造があります: スレッド コンテナーとリクエスト キュー


1. スレッド コンテナー


ここでは、スレッド プール内のすべてのスレッドの 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 つのリクエストの処理遅延がシステムによる他のリクエストの処理に影響を与えないため、リクエスト処理機能のパフォーマンス要件は小さくなります。もちろん、スレッドの数は動的に増加する必要があります)。

3. この方法は、同時実行性の高いサーバーには最適ではありません。1 つのプロセスが複数のユーザーのリクエストに応答する nginx と同様の方法の方が有利です。1. プロセスの数が固定されている。同時に多くのスレッドまたはプロセスが存在するため、メモリを大量に消費します。 2: nginx の動作プロセスの数は一般に CPU コアの数と一致しており、プロセスをコアにバインドできるため、プロセスの切り替えやスレッドの切り替えによって発生するシステムのオーバーヘッドが節約されます

上記ではスレッド プールの実装をその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート