是否在跨線程數據訪問時幾乎總是需要進行線程同步(即使用互斥鎖,信號量,臨界區等),即使通過一個線程後不需要需求分析?最佳實踐:線程之間的同步
0
A
回答
5
我總是會建議使用最簡單,最直接的同步方案走,直到分析顯示,你應該做的,否則 - 這通常意味着幾大門鎖與許多細粒度鎖或lockfree。
問題是,確定無鎖代碼是否正確比確定帶鎖的相應代碼是否正確困難得多。這給代碼的維護者造成了很大的負擔,並且很有可能他們會錯誤地引入錯誤。即使你知道無鎖是否對你的代碼當前被使用是安全的,這可能會在未來被那些不知道的人改變。其次,在許多情況下,代碼與鎖和無鎖代碼之間的性能差異是可以忽略的 - 直到您知道鎖爭用存在問題時,您不應該考慮無鎖。即使存在爭用問題,無鎖也不一定是最佳解決方案。
2
即使你並不需要一個互斥體,信號量,臨界區等,爲他們正常的鎖定語義,你可能還需要一個memory barrier。前者的結構通常意味着記憶障礙,這就是爲什麼刪除它們可以改變程序的原因。此外,這些問題可能非常難以調試,因爲涉及的線程的不同調度可能會使問題消失並出現。在最簡單的情況下,這意味着僅僅運行一個完全獨立的程序會改變你的行爲。
0
有道理的另一種模式稱爲無共享。 erlang和scala可能是這個模型的主要代表,具有erlang過程和scala actors。
這個想法是,您將消息發送到其他線程,其中消息是發件人未保存任何引用的數據。在實踐中,發送/接收隊列需要少量的鎖定,但是其餘的代碼可以在沒有任何問題的情況下鎖定。
這樣的模型可以用C++和其他語言實現。
http://www.scala-lang.org/node/242 http://lambda-the-ultimate.org/node/1742 http://docs.python.org/library/multiprocessing.html#module-multiprocessing
相關問題
- 1. cuBLAS同步最佳實踐
- 2. 多線程最佳實踐
- 3. 多線程最佳實踐
- 4. Delphi線程最佳實踐
- 5. NSUserDefaults同步的最佳實踐
- 6. 同步兩個表,最佳實踐
- 7. Web API同步呼叫最佳實踐
- 8. iOS IMAP與MailCore最佳實踐同步
- 9. 數據庫同步 - 最佳實踐
- 10. 多步驟流程的最佳實踐
- 11. 異步Webrequest最佳實踐
- 12. 異步編程最佳實踐
- 13. Java UDP多線程的最佳實踐
- 14. java中的多線程最佳實踐
- 15. Java線程會話的最佳實踐
- 16. WPF客戶端和服務器最佳實踐之間的WCF同步
- 17. iOS線程 - 回調最佳實踐
- 18. 最佳實踐來使用線程
- 19. ASP.NET和多線程最佳實踐
- 20. 在類之間使用相同函數的最佳實踐
- 21. Java線程可見性 - 沒有顯式同步的最佳可見性實踐
- 22. 關於同步性/異步性假設的最佳實踐
- 23. SPA應用程序和服務器同步,最佳實踐
- 24. Laravel異步請求的最佳實踐
- 25. JPA/Hibernate實體類和同步的最佳實踐是什麼?
- 26. 同步兩個不同系統用戶的最佳實踐表
- 27. Java - 網絡 - 最佳實踐 - 混合同步/異步命令
- 28. 在不同編程語言之間傳遞加密數據的最佳實踐
- 29. 最佳實踐
- 30. 最佳實踐
如果它不要求它不是必需的。你到底在問什麼? – sth 2009-06-25 20:34:34
無論是否需要,我是否應該在跨線程訪問數據時鎖定線程? – stanigator 2009-06-25 20:35:45