我是否需要在返回容器副本的函数上添加锁?

2024-01-06

class Manager {
public:

    list<Employee> getEmployees() {
        // Do I need to lock here?
        return emps_;
    }
    void addEmp(Employee emp); //Here I have lock
private:
    list<Employee> emps_;
};

实例Manager在多个线程之间共享。 我需要添加锁吗getEmployees会员功能?

我非常确定我需要锁,因为完整的列表已被复制,因此在此期间(直到复制完成)进行的任何修改都可能会破坏复制操作。

我只是问这个问题,因为我很少有人认为不需要锁定。

Edit:

既然现在很清楚需要 lock ,我的问题是如何以最小的开销来做到这一点。 通过执行以下解决方案,您可以将列表复制两次:

list<Employee> getEmployees() {
    pthread_mutex_lock( &mutex1 );
    list<Emp> tmp  = emps_; //Copy 1 
    pthread_mutex_unlock( &mutex1 );
    return tmp;//Copy 2
}

整个列表被复制,但副本的源可能正在修改。 stdlib 容器支持完全并发的未锁定读取访问。另一方面写...

如果您要在可能进行复制时写入此列表,则需要将其锁定。顺便说一句,SWMR(单写入多读取)锁非常适合这种情况,特别是如果您有数十甚至数百个线程需要制作副本,而只需要偶尔写入。即便如此,编写者请求的匮乏是一个需要通过锁定类的实现来解决的真正问题,但不适用于您此处问题的范围(没有双关语)。

关于您的更新,我是适当时范围释放锁的忠实粉丝,在您的情况下也是如此。 IE。围绕互斥体的作用域对象包装器,在进入时锁定它,并在作用域退出时解锁它。

我非常确定 boost:: 人们可以轻松获得这样的东西,就这一点而言,C++11 也可能如此(由于工作安排,我还没有采取这种措施;没有停机时间啊)。但你想要这样的东西:

list<Employee> getEmployees() 
{
    scope_lock latch(&mtx);
    return emps_;
}

The scope_lock上面只是一个简单的类,它在构造时锁定互斥锁,并在销毁时解锁它。这可以防止复制构造中抛出的异常不会永久挂起互斥体的可能性。将其视为利用自动破坏来解锁互斥锁。RAII http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization为了胜利。

我希望这是有道理的。对于像这样的小人物来说,这样的东西是理想的。再说一次,包括 boost 在内的许多工具包可能都内置了这样的东西,如果任何 boost 人员读到了这篇文章,请牛仔起来并指点一下。上面的示例是您所能得到的最简单的作用域锁。

最后,对于 SWMR,逻辑完全相同。唯一的区别是锁将需要一个额外的参数来确定您是否请求读或写访问权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否需要在返回容器副本的函数上添加锁? 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 用于 POST 请求的 Django Rest 框架自定义过滤器

    在filters py中 我有一个CustomFilter定义了具有类型值的ComboSortFilter and IntegerListFilter 在views py中 我定义了一个ViewSet 它具有filter class Cus
  • 我可以使用在启动期间配置的 MvcJsonOptions 在自定义中间件中进行序列化吗?

    我正在构建一个带有用于全局异常处理的中间件的 ASP NET Core Api 在Startup类中 我配置了一些用于所有控制器的 JSON 选项 public void ConfigureServices IServiceCollecti
  • TensorFlow 的内存泄漏

    我的 TensorFlow 出现内存泄漏 我提到了Tensorflow 即使关闭会话也会发生内存泄漏 https stackoverflow com questions 35695183 tensorflow memory leak eve
  • Vue.js filterBy 在多个字段中搜索

    如何通过在多个搜索键中搜索来进行过滤 我正在尝试这样的事情 但是 当然 它不会起作用 tr AFAIK 没有记录 filterBy 自定义过滤器 但您可以使用method制作你自己的过滤器 var demo new Vue el demo
  • 只能使用绝对 URI 作为基地址

    请帮助获得例外using ServiceHost host new ServiceHost typeof HelloService HelloService 在下面的代码中 例外 只有绝对 URI 可以用作基地址 WCF 主机应用程序 cl
  • Redis 尝试连接到 Heroku 上的本地主机而不是 REDIS_URL

    我有一个 Rails 应用程序 它使用 Redis 进行后台作业 在 Heroku 上 我使用 Heroku Redis 插件 当我部署到 Heroku 时 出现以下错误 Redis CannotConnectError Error con
  • 为什么Android开发中一定要把这个Context作为参数传递呢?

    这是来自developer android com 上的课程 public void sendMessage View view Intent intent new Intent this DisplayMessageActivity cl
  • 打印对象如何会导致与 str() 和 repr() 不同的输出?

    我正在解释器上测试一些代码 我注意到一些意外的行为sqlite3 Row http docs python org library sqlite3 html sqlite3 Row class 我的理解是print obj总是会得到相同的结
  • django-compressor 离线生成错误

    我正在尝试使用 django compressor 压缩我的 CSS 文件 但我不断收到此错误 compressor exceptions OfflineGenerationError You have offline compressio
  • 如何在 React Navigation 中刷新

    一旦我删除用户令牌 用户就会重定向到登录页面 但是如果我用其他用户登录 主页仍然显示以前的用户信息 这是因为我没有刷新主页 如何在反应导航中手动重新初始化 主页 MainPage Logged in as matt gt Logout gt
  • 从后台工作人员更新 GUI

    问题的名称是 从后台工作人员更新 GUI 但正确的名字是 world 从后台工作人员更新 GUI 或从后台工作人员报告多个变量 整数除外 请让我解释一下我的情况 在一个程序中 我有一个后台工作人员来分析信息 分析的结果是 表单 GUI 元素
  • 像 root 用户一样运行 PHP shell_exec()

    我构建了一个 PHP 应用程序 在其中为 Linux debian Jessie 创建命令行功能 一切正常 但我需要能够使用一些命令 例如 root 用户 有没有办法使用 shell exec 或类似的命令通过 PHP 像 root 用户一
  • postgres 中的顺序扫描和位图堆扫描有什么区别?

    在解释命令的输出中 我发现了两个术语 顺序扫描 和 位图堆扫描 有人可以告诉我这两种扫描有什么区别吗 我使用的是PostgreSql http www postgresql org docs 8 2 static using explain
  • Node.js 和express.js 中基于组/规则的授权方法

    Express js 中基于角色的授权有哪些好的策略 特别是对于快递资源 With 快递资源 https github com visionmedia express resource没有处理程序 所以我认为有三种选择 使用中间件 将授权函
  • 服务器管理 - 需要脚本来监控服务器上的可用空间

    需要脚本来监控服务器上的可用空间如果可用内存空间达到某个阈值发送警报邮件 PS 我认为解决方案是 Power Shell Windows Timer Job 不过我对 Power Shell 还很陌生 您可以使用如下命令获取可用磁盘空间 w
  • PHP 中的日历日视图

    我正在努力向现有日历解决方案添加日视图选项 像许多实现自己的日历的人一样 我正在尝试对 Google 日历进行建模 他们有一个出色的日历解决方案 并且他们的日视图提供了很大的灵活性 大多数情况下 实施进展顺利 然而 当涉及到冲突事件时 我遇
  • 如何更改DataGridView中某些单元格的边框颜色?

    我需要编程更改 CellFormatting 事件中某些单元格的边框颜色 单个单元的板颜色可以更改吗 你可以画一个矩形 在此示例中 我在选定的单元格上放置了红色边框 private void dataGridView CellPaintin
  • 客户端服务器udp套接字

    您好 我有一个 udp 客户端服务器代码无法正常工作 我问一个一般性问题 Shane 是个好孩子吗 这两个代码都没有出现错误 但是当我运行它输出的代码时 数据报发送数据包 新的 DatagramPacket sendData sendDat
  • Scala 中的类型级编程

    我想更深入地了解 Scala 中的类型级编程 因此我开始做一些小练习 我从类型级别的皮亚诺数的实现开始 这是下面的代码 sealed trait PeanoNumType Type at the end indicates to the r
  • 我是否需要在返回容器副本的函数上添加锁?

    class Manager public list