从unordered_map存储和检索后对象更改

时间:2015-08-29 20:34:38

标签: 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);
}

2 个答案:

答案 0 :(得分:2)

你必须遇到问题。首先,你声明m1m4作为参考,它们应该如此。

其次,代码风格:)。

所以,这将解决它:

Mutex &m1 = mutex_by_name("hello");

//...

Mutex &m4 = mutex_by_name("hello");

答案 1 :(得分:1)

主要需要制作m1和m4参考(Mutex&amp; m1)。现在它们是副本,因此不会更新无序映射中的值。