簡體   English   中英

const方法的const引用返回的線程安全性

[英]Thread safety of const reference return of const method

考慮這個課程:

#include <vector>

class A {
private:
    std::vector<int> m_vector;
public:
    void insertElement(int i) {
        m_vector.push_back(i);
    }
    const std::vector<int>& getVectorRef() const {
        return m_vector;
    }
};

方法getVectorRef是否安全?

是否有可能在getVectorRef返回期間彈出另一個線程並調用insertElement ,以便成員向量發生更改並且getVectorRef的調用者得到錯誤的const引用?

有兩個const限定符(一個用於向量而另一個用於方法)在線程安全的上下文中沒有意義嗎?

成員函數是線程安全的 ,你的接口不是 在設計為線程安全的類中,您不能產生您維護的對象的引用 ,就好像用戶保持引用放置,她可以在其他操作到位時使用它。

成員函數在技術上是線程安全的。 對成員的引用基本上是它的地址,並且該地址不能更改。 無論其他線程正在做什么,引用將始終引用完全相同的對象。 但這通常不是你主要擔心的問題。 真正關心的是用戶可以使用函數的返回做什么,在這種情況下答案基本上沒有

一旦用戶獲得引用,當與原始對象中該成員的任何修改相結合時,通過它的任何訪問都將導致競爭條件。 提供引用后,您無法提供安全同步,無法從產生引用的類中創建線程安全接口。

如果您需要使訪問線程安全,您可以選擇復制值(在關鍵部分內)或提供更細粒度的函數來處理來自用戶的更高級別的請求。

我建議Anthony Williams 采取行動中C ++並發性,討論如何使接口線程安全。

暫無
暫無

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

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