簡體   English   中英

從多個線程讀取全局數據是否安全?

[英]Is it safe to read global data from multiple threads?

方案如下:

  1. 創建一個類的實例(std :: map)並將其作為全局變量進行處理。
  2. 產卵線程。
  3. 線程讀取並使用該類的相同全局實例(調用方法,訪問成員等)
  4. 所有衍生的線程都退出了
  5. 全局類實例被銷毀

沒有使用互斥鎖,沒有生成線程修改全局類實例。

這個可以嗎?

謝謝

只要你從未寫過那門課,你應該是安全的。

但是,只要您需要進行閱讀或寫作,就需要使用互斥鎖來保護讀寫。

您可能想要研究“可共享鎖”的想法:

Boost具有允許快速讀取的鎖定,但還包括在必要時將鎖升級為“編寫器”的選項。 我認為這可能對未來打樣很有價值。

http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.shared_lockable

通常是的,但這不是一個很難保證。

核心問題是你需要一個內存屏障來確保第一個線程將所有數據從寄存器寫回到內存。 但是,當您創建第二個線程時,很可能會發生這種情況。

只要沒有線程正在寫入,讀取全局數據是安全的。

只要保證數據不會同時發生變化,它就是安全的。

我會使用const資格來確保它。

const std::map<Key,Value> global = ...;

此外,如果您之后沒有修改map ,您應該在Loki::AssocVector :相同的界面,但更快的只讀用途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM