我正在實現一個消息傳遞算法。當節點有足夠的信息來組成消息時,消息在相鄰節點之間傳遞 - 從相鄰節點傳遞給節點的信息。如果我將每條消息都設置爲一個線程並使用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;
}
我喜歡代碼的透明度,如果可能的話想通過有一些替代有條件的鎖,以保持相同的接口?
聽起來像是你或多或少地重塑了CSP。如何找到一個爲你做這一切的CSP庫? – jalf 2011-04-22 10:00:58
@Jaif - 我認爲你是對的。我沒有聽說過CSP(我不知道計算機科學最終會讓我受益)。看起來我有一些使用Google搜索做... – Tom 2011-04-22 10:08:29