簡體   English   中英

線程范式?

[英]Threading paradigm?

是否有任何范例給您不同的心態或對編寫多線程應用程序有不同的看法? 也許感覺上有很大的不同,例如從過程編程到函數編程。

並發具有許多用於解決不同問題的模型。 Wikipedia的並發頁面列出了一些模型,並且還有一個頁面,用於並發模式 ,這為使用各種並發方法提供了很好的起點。

您采用的方法非常取決於當前的問題。 不同的模型解決了並發應用程序中可能出現的各種不同問題,有些模型建立在其他模型的基礎上。

在課堂上我被教導並發一起使用互斥同步來解決並發問題。 有些解決方案僅需要一個,但同時使用這兩個解決方案,您應該能夠解決任何並發問題。

對於截然不同的概念,您可以查看不變性和並發性。 如果所有數據都是不可變的,那么甚至不需要常規的並發方法。 本文探討了該主題。

我不太了解這個問題,但是如果您開始使用CUDA進行一些編碼,則會為您提供有關多線程應用程序的不同思考方式。

它與一般的多線程技術(例如信號量,監視器等)不同,因為您同時具有數千個線程。 因此,CUDA中的並行性問題更多地在於對數據進行分區和稍后混合數據塊。

完全重新思考一個常見串行問題的一個小例子就是SCAN算法。 它很簡單:

  • 給定SET {a,b,c,d,e}

我需要以下設置:

{a,a + b,a + b + c,a + b + c + d,a + b + c + d + e}

在這種情況下,符號“ +”是任何交換運算符(不僅是加號,還可以進行乘法運算)。

如何並行執行此操作? 本文對此進行了全面的重新思考。

可以在NVIDIA 網站上找到CUDA中不同算法的更多實現。

好吧,一個非常保守的范式轉換是從以線程為中心的並發(共享所有內容)到以進程為中心的並發(地址空間分離)。 這樣一來,可以避免意外的數據共享,並且可以更輕松地在不同子系統之間實施通信策略。

這個想法是古老的,並由Micro-Kernel OS社區傳播(其中包括)以構建更可靠的操作系統。 有趣的是,Microsoft Research的Singularity OS原型表明,使用此模型時,甚至不需要傳統的地址空間。

我最喜歡的一個相對較新的想法是事務性存儲 :通過確保更新始終是原子性來避免並發問題。

看看OpenMP的有趣變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM