2009-06-25 83 views
0

是否在跨線程數據訪問時幾乎總是需要進行線程同步(即使用互斥鎖,信號量,臨界區等),即使通過一個線程後不需要需求分析?最佳實踐:線程之間的同步

+5

如果它不要求它不是必需的。你到底在問什麼? – sth 2009-06-25 20:34:34

+0

無論是否需要,我是否應該在跨線程訪問數據時鎖定線程? – stanigator 2009-06-25 20:35:45

回答

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