我有一个 std::map ,多个线程使用它来存储数据。地图声明如下:
std::map<int, Call> calls;
我必须从每个线程获取互斥锁,获取属于该线程的对象的指针或引用,然后释放互斥锁。之后我可以修改该对象,因为每个对象仅由一个线程使用。一旦线程死亡,映射中相应的对也会被删除。
我想知道实现这一点的最佳方法。我当时想了两种办法:
1)我知道这可能看起来非常疯狂,但仍然
std::map<int, Call> calls;
...
{
mutex.lock();
Call* callptr = &calls[id];
mutex.unlock();
// use callptr
}
或 2)我认为这个看起来更明智
std::map<int, std::auto_ptr<Call> > calls;
...
{
mutex.lock();
std::auto_ptr<Call> callptr = map[id];
mutex.unlock();
// use callptr
mutex.lock();
map[id] = callptr;
mutex.unlock();
}
这些线程实际上是在不同的 dll 中创建的,我没有相应的代码。我现在正在编写的这个 dll 由该 dll 导入并使用。因此它必须仅使用 std::map 来实现,但是任何人都可以告诉我这些方法之一是否可以或者是否有方法使其更稳定。
Thanks
您应该使用迭代器:
mutex.lock();
std::map<int, Call>::iterator callptr = calls.find(id);
callptr->second.foo();
...
mutex.unlock();
您的第一个使用指针的解决方案是有问题的,因为映射中对象的生命周期是不确定的 - 当插入或删除元素时重新平衡树时,它可能会被移动。
你的第二个解决方案根本不起作用,因为std::auto_ptr
不满足以下要求mapped_type
of std::map
- 主要是因为它的复制构造函数和operator=
实际上不要复制。您可能不会收到编译器错误,但您会在运行时收到非常奇怪的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)