Poco::TCPServer フレームワーク (Windows で使用されるモデルを選択) についての学習メモ、pocotcpserver_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:01:45
オリジナル
1023 人が閲覧しました

Poco::TCPServer フレームワークについて (Windows で使用されるモデルを選択) 勉強メモ。、pocotcpserver

手順

なぜこの記事を書いているのですか? Ah Er の Dream Boat の http://www.cppblog.com/richbirdandy/archive/2010/09/10/123994.html を読んだのです。

残念ながらコードが多すぎて面倒に見えるので、今後自分が使いやすいようにフローチャートで簡略化します。 この記事の内容はWindow API分析に基づいています。

この記事の poco はバージョン 1.4.6p4 (2014-04-18) です

poco のバージョンは 1.6 になりましたが、呼び出しはあまり変わっていません。

pocoダウンロードアドレス: http://pocoproject.org/releases/

この記事では、分析のエントリ ポイントとして TimeServer.cpp を使用します。

始める前に知っておくべきこと:

1,Inlineインライン関数: を参照してください:

http://blog.sina.com.cn/s/blog_90e888f50100zgo2.html

主に実行効率の向上のため。

2、クラスメンバー関数のオーバーロード、書き換え、非表示

参考:

dazhong159さんの<クラスメンバー関数のオーバーロード、書き換え、オーバーライドの違い>

http://blog.csdn.net/dazhong159/article/details/7844369

コード内で広範囲に使用、書き換え、隠蔽されています。

3、モデル選択の原則:

引用

6 つのソケット I/O モデルのユーモアを交えた説明

http://blog.csdn.net/normalnotebook/article/details/999840

内容:

for i:=0 to fd_read.fd_count-1 do //注意、fd_count それは同期操作です。

ラオ・チェンは娘の手紙が見たがっています。娘からの手紙があるかどうかを確認するために、10分ごとに階下の郵便受けをチェックするほどです~~~~~

この場合、「郵便受けをチェックするために階下に行って」、それから二階に戻ると、チェンさんは非常に遅れてしまい、他の仕事ができなくなってしまった。

選択モデルは Lao Chen の状況と非常によく似ています。何度も確認して...データがある場合...受信/送信...



リーリー
したがって、選択モデルは一般的な小規模接続にのみ使用できます。高い同時実行性は受け入れられません。

4、

コンストラクターの初期化シーケンスの理解

C++ コンストラクターは次の順序で呼び出されます:

(1) 仮想基本クラスのコンストラクターは、継承された順序で構築されます

。 (2) 非仮想基本クラスのコンストラクターは、継承された順序で構築されます。 (3) メンバー オブジェクトのコンストラクターは、宣言された順序で呼び出されます。

(4) クラス独自のコンストラクター。



5、FastMutexミューテックス変数について

bool NoticeQueue::empty() const

{

FastMutex::ScopedLock lock(_mutex);

return _nfQueue.empty();

}

empty() が実行された後、~FastMutex::ScopedLock デストラクターを呼び出して解放します。

ウィンドウの下で使用される重要なセクション:

class Foundation_API MutexImpl

{

protected:

MutexImpl();

~MutexImpl();
void lockImpl();
bool tryLockImpl();
bool tryLockImpl(long ミリ秒);
voidunlockImpl();

private:

CRITICAL_SECTION _cs;//クリティカルセクション

};
Windows環境で使用されるクリティカルセクションを確認できます。

6、スレッドについて:

窓の下で使用します

_thread = (HANDLE) _beginthreadex(NULL, _stackSize, ent, this, 0, &threadId);

スレッド操作を実行します。

7. イベントの待機と接続リクエストの同期が使用されます

WaitForSingleObject(

これも私のお気に入り

)

SetEvent ()、ResetEvent() を通じてリセットをアクティブ化します。

8、static_cast<>dynamic_castの使用法。

以下を参照してください:

http://www.cnblogs.com/bastard/archive/2011/12/14/2288117.html

http://www.cnblogs.com/jerry19880126/archive/2012/08/14/2638192.html

コードの例:

void* pThread;

reinterpret_cast(pThread)->pRunnableTarget->run();

//reinterpret_cas この変換は最も「安全ではない」ものです。たとえば、この変換を使用して 2 つの無関係なクラス ポインター間の変換を行うことができます。

_threadId = static_cast(threadId);

//static_castは基本的なデータ型変換(char、int)とポインタ間の変換に使用されます

9、スマート(スマート)ポインタauto_ptrについて

auto_ptr 簡単に言うと、(例外があるかどうかに関係なく) 作成されたリソースを終了時に解放できるようにします

std::auto_ptr pConnection(_pConnectionFactory->createConnection(pCNf->socket()));

AutoPtr<通知> pNf = _queue.waitDequeueNotification(idleTime);

内で直接見つけることができます

template
class auto_ptr
{ // 確実に破棄するためにオブジェクト ポインタをラップします

以下を参照できます:

より効果的な C++ 中国語版.pdf 7.4 アイテム M28: スマート ポインターの章 (baidu で検索してダウンロード)

http://blog.chinaunix.net/uid-9525959-id-2001803.html

のスニペット:

auto_ptr 使用の落とし穴を回避する方法

auto_ptr は確かに便利ではありますが、欠点もあるので、使用する際には注意が必要です。 まず第一に、auto_ptr オブジェクトを STL コンテナの要素として使用しないでください。 C++ 標準ではこれを明示的に禁止しています。そうしないと、予期しない結果が発生する可能性があります。
auto_ptr のもう 1 つの欠陥は、配列を auto_ptr のパラメータとして使用することです:
auto_ptr pstr (new char[12] ) //Array; を使用するときは必ず覚えておいてください。操作中に、配列を破棄するには delete[] を使用する必要があります。 auto_ptr のデストラクターは非配列型でのみ機能するためです。したがって、配列を正しく破棄できない場合、プログラムの動作は不明確になります。つまり、auto_ptr は new によって割り当てられた単一のオブジェクト ポインターを制御するだけで、それ以上は制御しません。
ただし、この問題は C++ 11 標準で解決されています。

unique_ptr

独自のオブジェクト所有権セマンティクスを備えたスマート ポインター

STL コンテナーで使用できるオーナー ポインターは 1 つだけです

shared_ptr

オブジェクト所有権の共有セマンティクスを備えたスマート ポインター

共有可能なポインター

weak_ptr

std::shared_ptr によって管理されるオブジェクトへの弱い参照

弱参照ポインタ

auto_ptr

厳密なオブジェクト所有権セマンティクスを備えたスマート ポインター

所有者ポインターは 1 つだけ存在でき、STL コンテナーでは使用できません

遠くまで行ってしまったので、さらに深く進みたいです (あまり考えすぎないでください -_-)、baidu をお願いします...

上記を読んで、あらゆる知識が集約されていることがわかりました

したがって、私たちは依然としてオープンソースコードを調べる必要があります。以前は、会社はオープンソースを使用していませんでした...うーん...スタート

クラス間の関係は主にコード内で使用されます

画像が広すぎて表示できません(新しいタブで画像を開いてください。よろしくお願いします。)

メインカテゴリ:

1、TCPServer メイン サービス。選択モデルを呼び出して接続メッセージの変更を処理します。

2. PooledThread はスレッド プールであり、アクティブ化されると、TCPServerDispatcher::run() が呼び出され、パッケージの受信後に特定のリクエストが処理されます。

TimeServerConnection.run()

TimeServerConnection.run() はプログラマ定義の関数を実装するためにサブクラスによって隠蔽されています。

3、TCPServerDispatcher、ディスパッチマネージャー (ここではそう呼ぶことにします) メッセージの変更を受信し、キューに入れ、接続数を管理します。

キューに追加されると、PooledThread 内のイベントがアクティブ化されます。

PooledThread は次に TCPServerDispatcher::run() をアクティブ化します [条件が許せば、相互アクティブ化と呼びましょう]

4、TCPServerConnection。特定の動作を実装するには、サブクラスの run() を継承して実装関数をカスタマイズします。 5、TCPServerConnectionFactory は TCPServerConnection の作成と管理を担当します。

6. TCPServerParams のパラメータ管理については説明しません。

7,NotificationQueue は、管理のために接続をキューに入れます。

主要カテゴリの紹介を読んだ後は、他のプロセスについても一般的に理解できるはずです。

フローチャート:

写真が長すぎるので

画像が広すぎて表示できません(新しいタブで画像を開いてください。よろしくお願いします。)

まずはPooledThreadのプロセスを見てみましょう

TCPServerが支配するプロセスをもう一度見てみましょう

画像が広すぎて表示できません(画像を新しいタブで開いてください。ありがとうございます。)


Windows での select のパフォーマンスは実際にはあまり良くなく、Linux バージョンでは epoll が使用されます。

epoll は select よりも効率的です。 http://blog.csdn.net/legion8169/article/details/1637154 を参照してください。

但poco tcpserver 中是有线程池操作的,所以说来效率不会太低.

 

 

 

先到这儿,还没有写完.

我们可以改变什么:

    ThreadPool(<span>int</span> minCapacity = <span>2</span><span>,
        </span><span>int</span> maxCapacity = <span>16</span><span>,
        </span><span>int</span> idleTime = <span>60</span><span>,
        </span><span>int</span> stackSize =<span> POCO_THREAD_STACK_SIZE);
        </span><span>///</span><span> Creates a thread pool with minCapacity threads.
        </span><span>///</span><span> If required, up to maxCapacity threads are created
        </span><span>///</span><span> a NoThreadAvailableException exception is thrown.
        </span><span>///</span><span> If a thread is running idle for more than idleTime seconds,
        </span><span>///</span><span> and more than minCapacity threads are running, the thread
        </span><span>///</span><span> is killed. Threads are created with given stack size.</span>
ログイン後にコピー

增加线程池中线程数(费话!),来加快select 中处理.

在中等程序中,增加  TCPSelect Manage进程,  来负责与多个  TcpServer 的进程通信.

即再增加一个管理者(中间键,或activemq之类),来加强并发能力,

或者直接使用linux 环境 ,即用了epoll 来实现高效性.

 

个人愚见,可能有些没写明白.还望高手指点.

谢谢.

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/971772.htmlTechArticle关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,pocotcpserver 说明 为何要写这篇文章 ,之前看过阿二的梦想船的Poco::TCPServer框...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!