如果有兩個線程剛剛讀取全局變量,是否需要使用互斥鎖來鎖定和解鎖全局變量?C++ pthread,兩個線程讀取全局變量
8
A
回答
2
如果他們是只是閱讀,那麼你不需要鎖定。
2
如果他們只是在閱讀,那麼就不需要鎖定,但當情況並非如此,那麼我認爲互斥將確保閱讀線程不會佔用資源,而無需執行任何操作。
像這樣: -
Thread1() {
Mutex_lock();
Process global_variable;
Unlock_mutex();
}
類似地,對於Thread2
在一個側面說明: -
互斥通常用於防止多線程訪問共享存儲器或其他資源同時。另外要記住,它不會鎖定任何東西
5
如果線程只讀取變量和沒有人正在寫入它(不是線程之一,而不是其他人),那麼你是完全沒有鎖。如果可能發生任何併發修改,那麼每個人(包括純粹的讀者)都必須以某種方式進行同步 - 通過互斥鎖,讀/寫鎖或其他方式進行同步。
3
一般來說,需要獨家訪問防止看到不一致的狀態。對於讀者線程,這意味着避免部分讀取。
這是什麼意思?想象一下,你有一個存儲在兩個(原子)整數上的值,例如座標。
int i = 3;
int j = 4;
現在,我們要讀i
和j
而他們進行修改,更準確地說,當一個Writer
線程要以對角線方式移動從(3, 4)
到(4, 5)
:
Reader Writer
| |
| i = 4
| |
i = 4 <pause>
j = 4 |
| j = 5
| |
這就是所謂的一個部分閱讀:Reader
線程已獲得信息,該對象是在(4, 4)
即使它從來沒有。我就讓你想,如果這些座標被用來計算飛機的軌跡會發生什麼......
避免部分讀取但是是相當容易:突變應該看到原子。
- 如果沒有突變(在這段時間的讀取),那麼你可以只讀取
- 如果有突變,你需要一個互斥機制(如讀/寫互斥)
因此,要回答你的問題,如果只有訪問是讀取訪問,則不需要同步。但是如果你有時(甚至很少)修改讀取的信息,那麼你需要一些機制。
相關問題
- 1. 同時從2個線程讀取全局變量
- 2. Objective-C,全局變量和線程
- 3. C++多線程安全局部變量?
- 4. 從多個線程讀取全局值
- 5. 全局變量和線程
- 6. Python全局變量線程
- 7. C - 使用pthread在兩個線程之間重現全局變量的同步問題
- 8. 理解爲什麼多線程無法讀取全局變量
- 9. 從線程讀取全局變量並從另一個線程寫入該變量
- 10. Python線程全局變量問題
- 11. C#變量線程安全
- 12. 一個線程讀取和另一個寫入volatile變量 - 線程安全?
- 13. 多個線程讀取一個變量
- 14. 一個程序有兩個線程,一個線程增加全局變量,其他線程減少相同的變量,這個變量總是正確的嗎?
- 15. 從Python中的一個線程讀取值:隊列或全局變量?
- 16. 裝配 - 線程安全局部變量
- 17. 函數不讀取全局變量
- 18. 從全局變量讀取和寫入
- 19. 在actionscript 2.0中讀取全局變量
- 20. C++全局變量
- 21. 全局變量,C
- 22. C#全局變量
- 23. C++:全局變量
- 24. 多線程定期更新全局變量,同時第三個線程等待讀取
- 25. 的Python線程和全局變量
- 26. java線程全局變量的同步
- 27. 並行線程和全局變量
- 28. 全局變量跨線程不更新
- 29. 線程中的全局變量
- 30. 在線程中設置全局變量
與上述問題類似。例如,我有兩個線程。每個線程調用一個對象的方法來獲取它的屬性,例如A-> getName()。在這種情況下,互斥是必要的嗎? –
@JohnSimpson:一個方法只不過是一個以'* this'作爲第一個參數的朋友函數的語法糖,所以問題只是關於*函數做了什麼?*如果方法只以只讀方式訪問對象方法,那麼它是沒問題的,所以如果方法是'const'或者函數通過const-pointer或const-reference接受對象,它應該沒問題(當心沒有考慮到多線程安全設計的mutable屬性) –