簡體   English   中英

std::weak_ptr 和相應的 std::shared_ptr 之間是否存在數據競爭?

[英]Is there any data race between std::weak_ptr and corresponding std::shared_ptr?

根據 cppref,跨多個線程訪問shared_ptrconst成員是安全的。 但是,當我們有一個對應於shared_ptrweak_ptr時,這個語句是否有效?

例如,假設以下代碼:

#include <memory>
#include <iostream>
#include <thread>

std::shared_ptr<int> sp;
std::weak_ptr<int> gw;

int main()
{
    sp = std::make_shared<int>(42);
    gw = sp;
    auto th1 = std::thread([]{
        for (int i = 0; i < 200; i++) {
            if (sp.use_count() > 1) {
                std::cout << i << "\n";
                std::this_thread::yield();
            }
        }
    });
    auto th2 = std::thread([]{
        for (int i = 0; i < 20; i++) {
            if (auto l = gw.lock()) {
                std::cout << "locked ->" << l.use_count() << "\n";
                std::this_thread::yield();
            }
        }
    });
    th1.join();
    th2.join();
}

此代碼創建 2 個線程。 一個檢查shared_ptr()use_count() ,這是一個const方法,另一個使用lock()鎖定weak_ptr()這也是一個const方法。 但實際上,當我在weak_ptr上調用lock時,我實際上增加了shared_ptr的引用計數,這不是線程安全的,除非引用計數受到內部保護。 我想知道在這種情況下我是否會進行數據競賽。 按照標准,這應該是線程安全的嗎?

是的。 引用計數器是原子的,因此您的示例中沒有數據競爭。

話雖這么說,對std::shared_ptr指向的對象的可變操作不是原子的,因此必須像通過普通指針保護訪問一樣保護它們。

暫無
暫無

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

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