存储和检索unordered_map后对象的变化

Object changing after storing and retrieving from unordered_map

本文关键字:对象 变化 map 检索 unordered 存储      更新时间:2023-10-16

考虑以下代码。我想用mutex_by_name()来创建和检索互斥锁。该锁不是真正的锁,但应该在一秒的间隔内完成它的工作。

预期输出是m4.lock()失败aka打印lock FAILED,因为_locked已经设置为true。但它确实锁住了。我是c++的新手,很确定我错过了一些明显的东西。你能解释一下如何正确地实现它吗?

#include <iostream>
#include <string>
#include <unordered_map>
#include <unistd.h>
class Mutex {
private:
    int _id;
    bool _locked = false;
    void status(std::string s) {
        std::cout << _id << " " << name << " " << s << " " << std::endl;
    }
public:
    const std::string name;
    Mutex(std::string name): name(name) {
        static int id = 0;
        _id = id++;
        status("created");
    }
    Mutex(const Mutex& m): _id(m._id), _locked(m._locked), name(m.name) {
        status("copy-constructed");
    }
    Mutex(Mutex&& m) = delete;
    void operator=(Mutex&) = delete;
    ~Mutex() {
        status("deleted");
    }
    void lock() {
        // YES, THIS IS NOT A REAL AND SAFE LOCK
        if (!_locked) {
            _locked = true;
            status("locked");
        } else {
            status("lock FAILED");
        }
    }
};
std::unordered_map<std::string, Mutex> mutexe;
Mutex& mutex_by_name(std::string name) {
    mutexe.emplace(name, Mutex(name));
    auto found = mutexe.find(name);
    return found->second;
}

using namespace std;
int main() {
    cout << "# 1" << endl;
    Mutex m1 = mutex_by_name("hello");
    m1.lock();
    sleep(1);
    cout << "# 2" << endl;
    Mutex m4 = mutex_by_name("hello");
    m4.lock();
    sleep(1);
}

你有问题。首先,你没有声明m1m4作为引用,它们应该是这样的。

第二,代码风格:).

那么,这个就解决了:

Mutex &m1 = mutex_by_name("hello");
//...
Mutex &m4 = mutex_by_name("hello");

主要需要m1和m4引用(互斥体&m1)。现在它们是副本,因此不会更新无序映射中的值。