なぜこの記事を書いているのですか? Ah Er の Dream Boat の ab570f199d08d129f6da4f7f248ad914 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インライン関数: を参照してください:主に実行効率の向上のため。
2、クラスメンバー関数のオーバーロード、書き換え、非表示
参考:
dazhong159さんの39172afb92fd2ac47de3443332142310
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++ コンストラクターは次の順序で呼び出されます:
(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_casta8093152e673feb7aba1828c43532094dynamic_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
//reinterpret_cas この変換は最も「安全ではない」ものです。たとえば、この変換を使用して 2 つの無関係なクラス ポインター間の変換を行うことができます。
_threadId = static_cast
//static_castは基本的なデータ型変換(char、int)とポインタ間の変換に使用されます
9、スマート(スマート)ポインタauto_ptrについて
auto_ptr 簡単に言うと、(例外があるかどうかに関係なく) 作成されたリソースを終了時に解放できるようにしますstd::auto_ptr
AutoPtr191fc64a02cdf1d0f7f8057b0f02733b pNf = _queue.waitDequeueNotification(idleTime); 内で直接見つけることができます template3ed4dd42ab208b5833c94137c0f66641 以下を参照できます: より効果的な C++ 中国語版.pdf 7.4 アイテム M28: スマート ポインターの章 (baidu で検索してダウンロード) http://blog.chinaunix.net/uid-9525959-id-2001803.html のスニペット: auto_ptr 使用の落とし穴を回避する方法
遠くまで行ってしまったので、さらに深く進みたいです (あまり考えすぎないでください -_-)、baidu をお願いします...
上記を読んで、あらゆる知識が集約されていることがわかりました
したがって、私たちは依然としてオープンソースコードを調べる必要があります。以前は、会社はオープンソースを使用していませんでした...うーん...。
スタート
TimeServerConnection.run() 3、TCPServerDispatcher、ディスパッチマネージャー (ここではそう呼ぶことにします) メッセージの変更を受信し、キューに入れ、接続数を管理します。
4、TCPServerConnection。特定の動作を実装するには、サブクラスの run() を継承して実装関数をカスタマイズします。
5、TCPServerConnectionFactory は TCPServerConnection の作成と管理を担当します。 6. TCPServerParams のパラメータ管理については説明しません。
画像が広すぎて表示できません(画像を新しいタブで開いてください。ありがとうございます。)
但poco tcpserver 中是有线程池操作的,所以说来效率不会太低. 先到这儿,还没有写完. 我们可以改变什么: 增加线程池中线程数(费话!),来加快select 中处理. 在中等程序中,增加 TCPSelect Manage进程, 来负责与多个 TcpServer 的进程通信. 即再增加一个管理者(中间键,或activemq之类),来加强并发能力, 或者直接使用linux 环境 ,即用了epoll 来实现高效性. 个人愚见,可能有些没写明白.还望高手指点. 谢谢.
class auto_ptr
{ // 確実に破棄するためにオブジェクト ポインタをラップします
auto_ptr は確かに便利ではありますが、欠点もあるので、使用する際には注意が必要です。 まず第一に、auto_ptr オブジェクトを STL コンテナの要素として使用しないでください。 C++ 標準ではこれを明示的に禁止しています。そうしないと、予期しない結果が発生する可能性があります。
auto_ptr のもう 1 つの欠陥は、配列を auto_ptr のパラメータとして使用することです:
auto_ptr424b5ca5994d08464738b3617afd1719 pstr (new char[12] ) //Array; を使用するときは必ず覚えておいてください。操作中に、配列を破棄するには delete[] を使用する必要があります。 auto_ptr のデストラクターは非配列型でのみ機能するためです。したがって、配列を正しく破棄できない場合、プログラムの動作は不明確になります。つまり、auto_ptr は new によって割り当てられた単一のオブジェクト ポインターを制御するだけで、それ以上は制御しません。
ただし、この問題は C++ 11 標準で解決されています。
まずは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>