c++ - 从 unordered_map 存储和检索后对象发生变化

标签 c++ c++11

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

预期输出是 m4.lock() 失败,也就是打印 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");

关于c++ - 从 unordered_map 存储和检索后对象发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32290406/

相关文章:

c++ - 如何从输入文件中读取带有 argv 和重定向的输入文件

c++ - 读取/dev/ttyACM0 文件的速度有多快?

c++ - 我可以告诉我的编译器忽略语句或函数的副作用吗?

c++ - 如何访问 C++11 中可能不存在的类型别名?

c++ - "_dyld_start"在我的分析结果中意味着什么?

c++ - Linux 中如何与进程通信?

c++ - 为什么 C++ 的 void 类型只是三心二意的单元类型?

c++ - std::promise 和 std::future 的非明显生命周期问题

C++11:按值调用、 move 语义和继承

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?