指向 std::map 中值的指针

2023-12-02

我有一个 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(使用前将#替换为@)

指向 std::map 中值的指针 的相关文章

随机推荐

  • printf,如何为整数插入小数点

    我有一个UINT16说的无符号整数 4455 312 560 or 70 如何使用 printf 在最后两位数字之前插入小数点 以便示例数字显示为 44 55 3 12 5 60 or 0 70 如果没有 printf 解决方案 是否有其他
  • 如何在下拉淘汰赛js中预先选择一个选项

    我已经查看了其他问题 但无法让我的选择框正常工作 绑定下拉 选择 列表的初始 默认值 我有以下游戏对象 function Game visitingTeamDetails homeTeamDetails game if arguments
  • 如何在android中绘制球体

    如何使用 OpenGL ES 在 Android 中绘制球体 您的问题可能与以下问题重复 在OPENGL ES中绘制球体时出现问题 在 OpenGL ES 中绘制球体 我建议您在提出问题之前先做一些研究 因为有很多教程可用于相同的内容 ht
  • 有没有办法禁用 Swing 应用程序的 Mac OS Retina 缩放?

    我们有一个相当复杂的应用程序 需要尽可能多的屏幕空间 自然 视网膜显示屏 Mac Book 非常适合此目的 然而 在 Swing 中这些设备似乎使用的是点而不是像素 它们允许我将图标更改为所讨论的更高分辨率版本here 但由于我们做了很多复
  • 如何在Python中的进程之间传递堆栈跟踪?

    我正在尝试创建一个 python 装饰器 它接受带有 args 和 kwargs 的函数 在新进程中执行它 关闭它并返回函数返回的任何内容 包括引发相同的异常 如果有 目前 如果函数没有引发异常 我的装饰器可以正常处理函数 但无法提供回溯
  • 一段时间后关闭 tkinter 窗口

    我有一段Python代码 应该打开一个新窗口一段时间 然后关闭该窗口 该窗口是通过单击按钮触发的 这是我所拥有的基础知识 def restore self self restore Toplevel message Select an av
  • 如何通过命令行删除 PostgreSQL 数据库[关闭]

    Closed 这个问题是无关 目前不接受答案 我正在尝试删除数据库并通过命令行创建一个新数据库 我使用登录psql U username然后做一个 connect template1 后面跟着一个DROP DATABASE database
  • 如何使用 PowerShell 修改 SharePoint 列表中的项目值

    如何使用 PowerShell 修改 SharePoint 列表中的项目值 当我尝试以下操作时 splist GetItems ForEach Object Write Host Item if Item eq null SPFileCol
  • 为什么动态添加的图像的offsetWidth总是0

    我正在通过 Javascript 添加图像 图像可以是任何尺寸 我想获取尺寸 宽度和高度 问题是 offsetWidth and style width始终为 0 这是一些要复制的代码 const container document ge
  • 当我重写 CreateParams 时,RichTextBox 不显示所有数据

    I foundNoBugz 编写的一些旧代码 汉斯 帕桑特 如果我理解的话 会强制 Richtextbox 使用 RTF 5 0 而不是 4 0 基本上它只是一个继承的类RichTextBox并覆盖CreateParams财产本身 priv
  • 用于多字节字符编码的 ucfirst() 函数

    我问过strtolower功能 但是当使用外来字符时 它不会将它们转换为大写 所以我必须使用 mb strtolower a utf8 但是如果我想使用我能做什么ucfirst 功能 我还没有找到任何类似的功能 可以在其中设置编码类型 没有
  • CSS 背景。将内容盒与盖子组合在一起

    如果我同时使用background origin content box 和背景大小 封面 在带有一些填充的元素上 背景图像仍然覆盖底部填充 在最新版本的 Safari Chrome Firefox 和 IE 中 div backgroun
  • 运行 LLVM 示例时遇到问题

    我在这个问题上挣扎的时间比我愿意承认的要长 并且非常感谢一些帮助 我正在尝试做一个涉及构建链接器和调度程序的项目 并且认为如果我可以使用 LLVM 中已经构建的一些功能 那就太好了 我正在使用 LLVM 10 为了开始使用 我做了一些阅读并
  • GL_DEPTH_TEST 和透明纹理的渲染故障

    从一个角度看 我的灌木看起来像这样 从另一个角度看 它们是这样的 我的理论是 当从第一个角度看灌木时 灌木后面的所有块都已经画好了 所以当绘制灌木时 它只是将它们绘制在上面 然而 从另一个角度来看 它基本上是先尝试绘制灌木 然后当 它去绘制
  • 对于无法使用 astype 进行转换的值使用 NaN

    我有一个非常大的 Pandas DataFrame 如下所示 gt gt gt d pd DataFrame a 1 U 3 4 gt gt gt d a 0 1 1 U 2 3 4 目前该列设置为object gt gt gt d dty
  • XQuery 和节点 ID

    我有这个变量 declare xmlDoc XML 它存储了以下 xml
  • `class HelloWorld : public Gtk::Window` 是什么意思?

    我正在按照 Gtk Hello World 教程找到here 我在类声明中遇到了一行我以前从未见过的行 我现在才学习编程几个月 我想知道是否有人可以向我解释一下 该线是 class HelloWorld public Gtk Window
  • 批处理文件根据名称将文件夹放入其他文件夹中

    有人提出了与此非常相似的问题 自动将文件放入文件夹中 但是我正在努力转换上述问题的答案以满足我的需要 我的问题是 我需要使用文件夹名称的一部分将文件夹移动到其他文件夹中 之前回答的问题是关于移动文件的 我的文件夹上有日期和时间戳2016 0
  • 匹配案例中的条件语句

    Python 中是否可以使用条件语句作为匹配语句的情况 工作是这样的 test Aston Martin makes Aston Martin Bentley match test case if test in makes print T
  • 指向 std::map 中值的指针

    我有一个 std map 多个线程使用它来存储数据 地图声明如下 std map