Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> 単純なLinuxスレッドプール

単純なLinuxスレッドプール

  

スレッドプール:簡単に言うと、スレッドプールは、受信したビジネスを簡単かつ迅速に処理するために事前に作成されたスレッドのバッチです。タスクの従来の到着と比較して、即座に対処するスレッドを作成し、スレッドの作成とリサイクルのオーバーヘッド、より速い応答とより高い効率を節約します。

Linuxでは、posixスレッドライブラリが使われます最初に、よく使われる関数がいくつか紹介されています:

1スレッドの作成とキャンセルの関数

pthread_create

スレッドの作成

pthread_join

スレッドのマージ

pthread_cancel

スレッドのキャンセル

2スレッド同期関数

pthread_mutex_lock

pthread_mutex_unlock

pthread_cond_signal

pthread_cond_wait

この関数の詳細については、manページを参照してください。

スレッドプールの実装:

スレッドプールの実装は、主に3つの部分、スレッドの作成、スレッドプールへのタスクの追加、およびワーカースレッドによるタスクキューからのタスクの削除に分けられます。

実装する主なクラスはCTask、CThreadPoolの2つです。

/**

タスクの実行、タスクデータの設定、および実行を行うクラス

** /

Cコード

クラスCTask

{

protected:

string m_strTaskName; //タスク名

void * m_ptrData; //実行するタスクの特定のデータ

public:

CTask(){}

CTask(string taskName)

{

this-> m_strTaskName = taskName;

m_ptrData = NULL;

}

virtual int Run()= 0;

void SetData(void * data); //タスクデータの設定

};

タスククラスは仮想クラスです。実行インターフェイスを実装するには、すべてのタスクをCTaskクラスから継承する必要があります。実行インターフェースに実装する必要があるのは、特定の構文解析タスクのロジックです。 m_ptrDataは、単純データ型またはカスタム複合データ型のいずれかのタスクデータへのポインタです。

スレッドプールクラス

/**

スレッドプール

** /

Javaコード

クラスCThreadPool

{

private:

vector< CTask *> m_vecTaskList; //タスクリスト

int m_iThreadNum; //スレッドプールで開始スレッド

静的ベクトル< pthread_t> m_vecIdleThread; //現在アイドル状態のスレッドコレクション

静的ベクトル< pthread_t> m_vecBusyThread; //現在実行中のスレッドコレクション

静的Pthread_mutex_t m_pthreadMutex; //スレッド同期ロック

静的pthread_cond_t m_pthreadCond; //スレッド同期条件変数

protected:

静的void * ThreadFunc(void * threadData); //新しいスレッドのスレッド関数

static int MoveToIdle(pthread_t tid); //スレッドの実行終了後に自分自身をアイドルスレッドにする

static int MoveToBusy(pthread_t tid); //話中線に移動

int Create(); //すべてのスレッドを作成します。

public:

CThreadPool(int threadNum);

int AddTask(CTask *) Task); //スレッドプールにタスクを追加します。

int StopAll();

};

スレッドプールオブジェクトが作成されたら、スレッドのバッチを開始します。すべてのスレッドを空きリストに入れるタスクが到着すると、スレッドはそのタスクを受け取り、それを処理します。

スレッド間の同期は、スレッドロックと条件変数を使用します。

このクラスには2つの外部インタフェースがあります。

AddTask関数は、タスクをスレッドプールのタスクリストに追加し、それを処理するようにスレッドに通知します。タスクが到着したら、そのタスクをm_vecTaskListタスクリストに入れて、処理のためにpthread_cond_signalでスレッドを起動します。

StopAll関数はすべてのスレッドを停止します。

Cppコード

************************* ************************

コード:

×××××× ×××××××××××× CThread.h

#ifndef __CTHREAD

#define __CTHREAD < Br>

#include< vector>

#include< string>

#include< pthread.h>

using namespace std;

/**

タスクの実行、タスクデータの設定、および実行のためのクラス

** /

のクラスCTask

{

protected:

string m_strTaskName; //タスクの名前

void * m_ptrData; //実行するタスクの特定のデータ

public:

CTask(){}

CTask(文字列taskName)

{

this-> m_strTaskName = taskName;

m_ptrData = NULL;

}

virtual int Run()= 0;

void SetData(void * data); //タスクデータを設定します

};

/**

スレッドプール

** /

クラスCThreadPool

{

private:

vector< CTask *> m_vecTaskList; //タスクリスト

int m_iThreadNum; //スレッドプールで開始されたスレッド数

静的ベクトル< pthread_t> m_vecIdleThread; //現在のアイドルスレッドコレクション

静的ベクトル< pthread_t> m_vecBusyThread; //現在実行中のスレッドコレクション

静的pthread_mutex_t m_pthreadMutex; //スレッドの同期ロック

静的pthread_cond_t同期条件変数

protected:

static void * ThreadFunc(void * threadData); //新しいスレッド用のスレッドスレッド関数

static int MoveToIdle(pthread_t tid); //スレッドの実行が終了したら、自分自身をアイドル状態にする中

static int MoveToBusy(pthread_t tid); //使用中のスレッドに移動する

int Create(); //すべてのスレッドを作成する

public:

CThreadPool(int threadNum);

int AddTask(CTask * task); //タスクをスレッドプールに追加する

Copyright © Windowsの知識 All Rights Reserved