關於多線程裡記憶體配置的問題

來源:互聯網
上載者:User

by    mayflowers

 

 

Quote:
資料上說User::Alloc 這個API 不是安全執行緒的(似乎除了繼承RHandleBase的類是安全執行緒的其他有關記憶體的分配的API貌似都不是安全執行緒的)

那麼如果我用了多線程技術,並且這些線程共用了堆區(如果不是共用堆區也就沒啥問題了),那麼在這些線程裡(包括主線程,一般是UI線程)用到User::Alloc的地方都得使用 同步操作(RMutex等)以保證安全執行緒,那麼問題來了,如果是一般的C類呢,分配記憶體的時候(NEW的時候)是不是也需要進行同步操作呢?如果需要,那麼我看到很多例子裡在副線程的啟動函數裡一般都會先建立清除棧,那也是C類,但似乎也從來沒有使用 同步操作啊?而且即使C類分配記憶體都需要加同步操作,這個工程也似乎也忒大了點吧(而且主線程裡可能在啟動了副線程後可能也要進行一些C類的分配記憶體,那也就是說這些C類難道也得加上同步操作??)

如果兩個線程共用堆,而且都有可能執行記憶體配置和釋放操作,就必須進行同步保護,這個和C類,R類,T類沒有關係。你看到的例子兩個線程應該是使用各自的堆。

在 windows 等平台上,不同線程預設使用同一個堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配記憶體的時候是使用了同步保護的。如果沒有同步保護,在兩個線程同時執行記憶體操作的時候會產生競爭條件,可能導致堆內記憶體管理混亂。比如兩個線程分配了統一塊記憶體位址,空閑鏈表指標錯誤等。

Symbian 的線程一般使用獨立的堆空間。這樣每個線程可以直接在自己的堆裡分配和釋放,可以減少同步所引入的開銷。當線程退出的時候,系統直接回收線程的堆空間,線程內沒有釋放的記憶體空間也不會造成進程內的記憶體流失。

但是兩個線程使用共用堆的時候,就必須用 critical section 或者 mutex 進行同步保護。否則程式崩潰時早晚的事。如果你的線程需要在共用堆上無規則的分配和釋放任何數量和類型的對象,可以定製一個自己的 allcator,在 allocator 內部使用同步保護。線程直接使用這個 allocator 分配記憶體就可以了。這相當於實現自己的 malloc,free。但是更建議你重新審查一下自己的系統,因為這種情況大多數是不必要的。經過良好的設計,線程的本地堆應該能夠滿足大多數對象的需求。如果有某一類對象需要在共用堆上建立和共用,這種需求是比較合理的,可以在這個類的 new 和 delete 上實現共用保護。

Quote:
還有就是動態數組RArray的問題,資料顯示它也不是安全執行緒的,由於在APEND的過程中可能需要記憶體的重新分配,也就是說如果用到上面的共用堆區多線程技術的話,那麼我在使用RArray的時候也必須加上同步操作嗎。

同步保護分為演算法級和容器級。容器級是指,對於數組這個容器而言,他的插入、刪除等操作收到內在的同步保護。不會有兩個會改變系統狀態的操作同時進行。演算法級是指對於某種特定的演算法來說是安全的。比如一個線程要刪除滿足某個條件的所有項,這時候,僅僅在數組的實現裡面對刪除一個元素的操作進行同步保護是不夠的。因為在兩次刪除之間,可能有別的線程改變數組的狀態。這時候需要演算法級的同步保護。演算法級的安全通常在容器外由用戶端提供。

Symbian的RArray沒有任何一個層級的同步保護。如果你的數組被一個線程在本地堆上使用,不需要同步。如果只被一個線程在共用堆上使用,只需要保證分配和釋放記憶體的操作是安全的就可以了。如果需要被多個線程共同操作,還需要根據需要提供容器級或者演算法級的同步保護。

by mayflowers

There is always a solution, which is so appealing, so quick and so wrong.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.