2012-04-26 127 views
5

我有幾個對象需要在C++中的不同線程上執行操作。我知道有必要同時鎖定多個線程可能使用的變量,但是如果每個線程正在訪問(寫入)同一對象的不同數據成員,該怎麼辦?例如,每個線程正在調用對象的不同方法,並且沒有任何方法調用相同的數據成員。只要我不訪問相同的數據成員,還是需要鎖定整個對象,是否安全?從C++中的2個不同線程訪問屬於同一對象的不同數據成員

我已經找過解釋和這個主題的細節,但每個例子似乎集中在單個變量或非成員函數。

總結: 我可以安全地訪問同一對象的2名不同的數據成員來自2個不同的線程,但不將鎖定整個對象呢?

+0

您如何確保您永遠不會從兩個線程同時訪問同一個成員? – 2012-04-26 13:54:34

+0

不能爲每個結構變量鎖定一個鎖,而不是每個結構鎖。細粒鎖定?? – 2012-04-26 13:55:10

回答

4

它是有效的安全措施,但如果您經常這樣做,會嚴重降低代碼的性能。計算機使用稱爲「高速緩存行」的東西,如果兩個處理器在同一高速緩存行上工作,則他們必須始終將其傳回&,從而減慢工作速度。

+0

+1虛假分享 – 2012-04-26 13:58:12

+1

如果數據成員沒有正確對齊,它也可能是不安全的 – user396672 2012-04-26 15:56:37

2

是的,通過不同的線程訪問一個對象的不同成員是安全的。

1

我認爲你可以做到這一點。但是最好確保方法內部不會改變訪問相同的數據,或者調用程序不會決定調用另一個線程已經在使用的另一種方法。

所以可能,但潛在的危險。但是它也會更快,因爲你將避免調用獲得互斥體。選擇你的毒藥。

0

只要我不訪問相同的數據成員,或者我是否需要鎖定整個對象,它是否安全?

答案完全取決於類的設計,但我仍然會說,總是建議在允許多個線程訪問同一對象之前考慮100次。鑑於事實,如果您確定數據是確實獨立他們是需要鎖定整個對象。

然後出現一個不同的問題,「如果變量確實是獨立的爲什麼他們在同一類?」如果弄錯了,請小心穿線。

0

嗯,是的,你可以做,但是,正如其他人指出的,你不應該這樣做。恕我直言,對數據成員的訪問應該通過getter/setter方法,以便任何必要的mutexing/criticalSectioning/semaphoring /封裝在對象內的任何東西。

相關問題