2011-04-22 36 views
6

我正在實現一個消息傳遞算法。當節點有足夠的信息來組成消息時,消息在相鄰節點之間傳遞 - 從相鄰節點傳遞給節點的信息。如果我將每條消息都設置爲一個線程並使用boost :: condition將線程置於睡眠狀態,直到所需的信息可用,那麼實現將變得微不足道。無條件替代等待條件。 (編輯:前景模式與boost.asio?)

不幸的是 - 我在圖中有100k節點,這意味着300k線程。當我asked如何使這麼多線程的答案是,我不應該 - 而是重新設計。

我的問題是:有沒有等待條件的標準設計模式? 也許一些異步控制模式?

編輯:我想我可以用proacator模式做到這一點。 我已編輯標籤以包含boost :: asio - 以查看是否有人有此建議。

這樣的討論可以是具體的,這裏是如何的消息,到目前爲止定義:

class 
Message 
{ 
public:  
    Message(const Node* from, Node* to) 
    : m_from(from), m_to(to) 
    {} 
    void 
    operator()() 
    { 
    m_to->ReceiveMessage(m_from->ComposeMessage()); 
    } 
private: 
    Node *m_from, *m_to; 
}; 

這些消息函子正與升壓::線程啓動。然後我們有

class Node 
{ 
    Node(Node* Neighbour1, Node* Neighbour2, Node* Neighbour3); 
    // The messages (currently threads) are created on construction, 
    // The condition locks then sort out when they actually get passed 
    // without me having to think too hard. 

    void ReceiveMessage(const Message&); 
    //set m_message from received messages; 
    //EDIT This looks like an async write - use boost asio here? 

    Message 
    ComposeMessage() 
    { 
     // If possible I want to implement this function without threads 
     // It works great but it if every message is a thread 
     // then I have 300k threads. 
     // EDIT: this looks like an async read (use boost asio here?) 

     boost::mutex::scoped_lock lock(m_mutex); 
     while (!m_message) //lock the thread until parameter is set. 
     m_cond.wait(lock); 
     return *m_message; 
    } 
    private: 
    boost::optional<Message> m_message; 
    boost::mutex m_mutex; 
    boost::condition m_cond; 
} 

我喜歡代碼的透明度,如果可能的話想通過有一些替代有條件的鎖,以保持相同的接口?

+0

聽起來像是你或多或少地重塑了CSP。如何找到一個爲你做這一切的CSP庫? – jalf 2011-04-22 10:00:58

+0

@Jaif - 我認爲你是對的。我沒有聽說過CSP(我不知道計算機科學最終會讓我受益)。看起來我有一些使用Google搜索做... – Tom 2011-04-22 10:08:29

回答

3

我想你要找的是reactor pattern。這就是大部分活動不需要太多時間的地方,他們正在開展合作多任務處理。請參閱node.js以獲得這個想法的JavaScript實現,但在C++中,ACE library提供了這個概念,允許基於系統中的核心數量的多個線程開箱即用。

這些庫全部依賴於某些支持磁盤,網絡等非阻塞IO的OS API。當您不等待操作系統,但是應用程序中有另一個消息源時,它們會爲您提供相應的工具。

+0

謝謝你,一篇非常有趣的文章和Ace庫看起來可能會做的伎倆。 – Tom 2011-04-22 10:26:28