ホームページ  >  記事  >  バックエンド開発  >  Poco::TCPServer フレームワークに関する研究メモ (Windows で使用されるモデルを選択)。

Poco::TCPServer フレームワークに関する研究メモ (Windows で使用されるモデルを選択)。

WBOY
WBOYオリジナル
2016-08-08 09:27:421159ブラウズ

手順

なぜこの記事を書いているのですか? 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;//クリティカルセクション

};
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的另一个缺陷是将数组作为auto_ptr的参数:  
auto_ptr  pstr (new char[12] ); //数组;为定义
 
    记住不管什么时候使用数组的new操作时,必须要用delete[]来摧毁数组。因为auto_ptr的析构函数只对非数组类型起作用。所以数组是不能被正确摧毁的话,程序的行为是不明确的。总之,auto_ptr控制一个由new分配的单对象指针,仅此而已。

 不过C++ 11标准中解决了这问题:

unique_ptr

smart pointer with unique object ownership semantics

只能有一个主人的指针,可以用于STL容器

shared_ptr

smart pointer with shared object ownership semantics

可共享的指针

weak_ptr

weak reference to an object managed by std::shared_ptr

弱引用指针

auto_ptr

smart pointer with strict object ownership semantics

只能有一个主人的指针,不能用于STL容器

走远了,想深入(不要想多了-_- ),请baidu...

看完上面之些,发现是不是觉得 各种知识又巩固了.

所以还是要看开源代码,之前公司整死不用开源的...哎...

开始

代码中主要使用类的关系

图片过宽,不能显示(请 在新标签中打开图片.谢谢.)

主要的几个类:

1,TCPServer 主服务,负责 调用select 模型,来处理 连接消息的变化.

2,PooledThread 是线程池.当被激活时,调用 TCPServerDispatcher::run() 来处理收到包后的具体请求.而 TCPServerDispatcher::run()  中调用 

    TimeServerConnection.run().  TimeServerConnection.run()通过子类隐藏 来实现 程序员 自定义 功能.  不得不说写POCO的大牛利害.

3,TCPServerDispatcher,派遣管理者(先这么叫吧). 接收消息变化,放入队列.管理 连接数.

当放入队列时,会激活  PooledThread 中的事件 .

PooledThread 又反过来 激活 TCPServerDispatcher::run() [姑且叫 有条件时相互激活吧 ]

4,TCPServerConnection.实现具体行为,通过继承由子类的 run() 来自定义实现 功能.

5,TCPServerConnectionFactory 负责创建和管理 TCPServerConnection.

6,TCPServerParams 这个参数管理 ,就不说了.你懂的.

看完主要几个类的介绍,其它流程都应该懂大概了.

流程图:

由于图太长的关系多,

图片过宽,不能显示(请 在新标签中打开图片.谢谢.)

先看看 PooledThread 的流程吧

 再看下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 中处理.

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

谢谢.

以上就介绍了关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHP の XML DOM (10)次の記事:PHP の XML DOM (10)