簡體   English   中英

C++ 線程 lambda 捕獲 object 可以讀取但無法擦除

[英]C++ thread lambda captured object can read but cannot erase

我是 c++ 的新手,所以我的問題可能很簡單,但我無法解決。 在我的構造函數中,我想啟動分離線程,該線程將使用 class 變量循環並刪除舊數據。 用戶緩存.hpp

struct UserCacheItem {
    long m_expires;
    oatpp::Object<User> m_user;

    UserCacheItem(const long expires, const oatpp::Object<User> &user);
};

class UserCache {
private:

    std::map<std::string, std::shared_ptr<UserCacheItem> > m_userCacheItem;

public:
    UserCache();

    void cacheUser(std::string payload, std::shared_ptr<UserCacheItem> &userCacheItem);
};

用戶緩存.cpp

UserCache::UserCache()
{
    std::thread thread([this]() mutable {
        while (true){
            auto curTimestamp = std::chrono::seconds(std::chrono::seconds(std::time(nullptr))).count();

            for(auto &elem : m_userCacheItem){
                if (curTimestamp > elem.second->m_expires){
                    std::cout << "Erasing element: " << elem.second->m_expires << std::endl;
                    m_userCacheItem.clear();
                }
            }

            std::cout << "Cache size: " << m_userCacheItem.size() << " Current timestamp: " << curTimestamp << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(10));
        };
    });
    thread.detach();
}

當我到達行m_userCacheItem.clear(); 我得到分段錯誤。 當然,如果if block 是 false line with cout cache sizie 會被正確打印。 所以我可以讀取我的變量,但我不能修改它:(

我在哪里出錯?

迭代時不能修改 map

            for(auto &elem : m_userCacheItem){
                if (curTimestamp > elem.second->m_expires){
                    std::cout << "Erasing element: " << elem.second->m_expires << std::endl;
                    m_userCacheItem.clear();
                }
            }

如果要擦除元素,請使用 std::map::erase:

for(auto & it = m_userCacheItem.begin(); it != m_userCacheItem.end();) {
    if(condition) {
        it = m_userCacheItem.erase(it);
    } else {
        ++it;
    }
}

暫無
暫無

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

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