2010-06-29 157 views
2

我準備編寫一個多線程網絡應用程序。目前我想知道什麼是我的程序最好的線程模式。整個應用程序最多可處理1000個描述符(本地文件,各種協議的網絡連接以及定時器和信號處理的附加描述符)。應用程序將針對Linux進行優化。計劃將在普通個人電腦上運行,所以我認爲,他們將至少有Pentium 4處理器設計多線程應用程序(尋找設計模式)

這是我目前的想法:

  • 一個線程使用的epoll將處理網絡I/O 。
  • 第二線程將 處理本地狀I/O(磁盤I/O, 定時器,信號處理)使用的epoll
  • 第三線程 將處理UI(CLI,GTK +或QT)

處理單獨線程中的每個網絡連接會由於上下文切換過多而導致CPU死亡。

也許有更好的方法來做到這一點?

您是否知道有關設計多核應用程序的任何文檔/書籍?我正在尋找如下問題的答案:什麼是有理數的線程?等等。

回答

2

你在正確的軌道上。您希望使用線程池模式來處理網絡,而不是每個網絡連接一個線程。

本網站也可能對您有所幫助,並列出了最常見的設計模式以及它們可以在什麼情況下使用。 http://sourcemaking.com/design_patterns/

要處理磁盤I/O,您可能會考慮在Linux下使用mmap。它非常快速和高效。這樣,你會讓內核完成這項工作,你可能不需要一個單獨的線程來完成這個任務。

我目前在玩Boost :: asio,這似乎很不錯。它在linux上使用epoll。看起來你正在使用像Qt這樣的跨平臺GUI工具包,然後boost asio也會提供跨平臺支持,所以你可以在windows或linux上使用它。我認爲也可能有跨平臺mmap。