存储和检索unordered_map后对象的变化
Object changing after storing and retrieving from unordered_map
考虑以下代码。我想用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);
}
你有问题。首先,你没有声明m1
和m4
作为引用,它们应该是这样的。
第二,代码风格:).
那么,这个就解决了:
Mutex &m1 = mutex_by_name("hello");
//...
Mutex &m4 = mutex_by_name("hello");
主要需要m1和m4引用(互斥体&m1)。现在它们是副本,因此不会更新无序映射中的值。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 当我调用对象的方法时,对象的成员会发生变化
- MATLAB:跟踪imufilter对象中的状态变化
- 当对象传递给成员函数时,成员函数的行为会发生变化?
- C++不认识我在对象.cpp的变化
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 如何根据父对象的相对变化计算子对象的新全局位置
- 在X个对象之间跟踪一个对象中的变量变化
- 拍摄图像时亮度是否变化,请更改图像中的对象大小
- 如何处理类结构的变化,并与使用 boost 序列化的数据/对象向后兼容
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 在c++中,对象可以警告类它已经发生了变化吗?
- 存储和检索unordered_map后对象的变化
- 作用于可移动但不可复制对象序列的变化STL算法的行为