C++弱引用在多線程環(huán)境下的使用

c++
小樊
83
2024-09-10 16:58:31

在C++中,弱引用(weak_ptr)是一種智能指針,它可以存儲(chǔ)對(duì)對(duì)象的引用,但不會(huì)影響該對(duì)象的生命周期

以下是在多線程環(huán)境下使用弱引用的示例:

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

std::shared_ptr<int> sharedPtr;
std::weak_ptr<int> weakPtr;
std::mutex mtx;

void thread1() {
    std::unique_lock<std::mutex> lock(mtx);
    sharedPtr = std::make_shared<int>(42);
    weakPtr = sharedPtr;
    lock.unlock();
}

void thread2() {
    std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 等待一段時(shí)間以確保thread1已經(jīng)設(shè)置了weakPtr
    std::unique_lock<std::mutex> lock(mtx);
    if (auto sharedPtr2 = weakPtr.lock()) {
        std::cout << "Value: " << *sharedPtr2<< std::endl;
    } else {
        std::cout << "Object has been destroyed"<< std::endl;
    }
    lock.unlock();
}

int main() {
    std::thread t1(thread1);
    std::thread t2(thread2);
    t1.join();
    t2.join();
    return 0;
}

在這個(gè)示例中,我們創(chuàng)建了兩個(gè)線程。第一個(gè)線程創(chuàng)建了一個(gè)shared_ptr并將其存儲(chǔ)到全局變量sharedPtr中,然后將weak_ptr指向該對(duì)象。第二個(gè)線程嘗試從weak_ptr中獲取shared_ptr,如果成功,則輸出對(duì)象的值;否則,輸出“Object has been destroyed”。

注意,我們使用互斥鎖(std::mutex)來(lái)確保在訪問weak_ptr時(shí)不會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)。這是因?yàn)?code>weak_ptr的lock()方法不是線程安全的,所以我們需要在訪問它之前鎖定互斥鎖。

總之,在多線程環(huán)境下使用弱引用時(shí),需要確保對(duì)弱引用的訪問是線程安全的。這通常意味著使用互斥鎖或其他同步原語(yǔ)來(lái)保護(hù)對(duì)弱引用的訪問。

0