2011-04-12 63 views
1

我有一個函數的2個版本,這些函數在C++庫中可用,它們執行相同的任務。一個是同步函數,另一個是異步類型,允許註冊回調函數。使用異步方法vs線程等待

以下哪種策略更適合提供更好的內存和性能優化?

  1. 呼叫在輔助線程的同步功能,並使用互斥同步等到我得到的結果
  2. 不要創建一個線程,但調用的異步版本,並在回調得到的結果

我知道在選項1中創建工作線程會導致更多的開銷。我想知道與線程同步對象導致的開銷相關的問題,以及它如何與異步調用引起的開銷進行比較。函數的異步版本是否在內部分離了一個線程並使用了同步對象,還是使用了其他一些技術,如直接與內核對話?

+4

我們應該如何猜測一個圖書館我們沒有任何信息並且無法看到源代碼被實現?只要嘗試使用這兩種形式的功能和配置你的程序。 – Mankarse 2011-04-12 05:42:39

+0

我正在尋找一個典型的異步函數的一般方法 – paseena 2011-04-12 05:46:37

回答

0

使用異步功能,因爲可能會做你想做的手動與同步,但較少出錯。

異步:將創建一個線程,做的工作,完成後 - >調用回調
同步:創建一個事件來等待,工作創建一個線程,等待事件,在線程調用同步版本,傳輸結果,信號事件。

2

「簡介,不要推測。」 (DJB)

這個問題的答案依賴於太多的東西,而且沒有一般的答案。開發人員的角色是能夠做出這些決定。如果您不知道,請嘗試選項和措施。在很多情況下,這種差異並不重要,而不表現擔憂會佔主導地位。

「過早的優化是所有罪惡的根源,說的97%的時間」(DEK)

更新在回答這個問題編輯:

C++庫,在一般情況下,沒有得到使用魔法來避免同步原語。異步接口和同步接口很可能會包裝你將要做的事情。處理必須發生在上下文中,如果完成要發送給另一個上下文,則需要同步原語來完成此操作。

當然,可能還有其他的考慮。如果您的C++庫正在與可處理的某個硬件進行通信,則情況可能會有所不同。但你還沒有告訴我們這樣的事情。

這個問題的答案取決於您沒有給我們的上下文,包括有關庫接口和代碼結構的信息。

0

您可能會認爲每個線程都有自己的環境,因此在所有其他條件相同的情況下,它們會使用比非線程化解決方案更多的內存。

根據您的線程庫,啓動和停止線程也會有相當大的開銷。

如果您需要進程間同步,那麼調試線程代碼也會有很多麻煩。

如果您願意編寫非線程代碼(即不會耗費大量時間編寫和調試它),那麼這可能是最佳選擇。