ConcurrentDictionary 和 ConcurrentQueue 的这种组合是线程安全的吗?

2023-11-26

我在以下代码中使用 .NET 4 中的 ConcurrentDictionary 和 ConcurrentQueue 类。

这段代码是线程安全的吗?如果不是,我怎样才能使其线程安全?

public class Page
{
    public string Name {get; set; }
}

public class PageQueue
{
    private ConcurrentDictionary<int, ConcurrentQueue<Page>> pages =
        new ConcurrentDictionary<int, ConcurrentQueue<Page>>();

    public void Add(int id, Page page)
    {
        if (!this.pages.ContainsKey(id))
            this.pages[id] = new ConcurrentQueue<Page>();

        this.pages[id].Enqueue(page);
    }

    public Page GetAndRemove(int id)
    {
        Page lp = null;

        if(this.pages.ContainsKey(id))
            this.pages[id].TryDequeue(out lp);

        return lp;
    }
}

Demo:

 public class Demo
 {
     public void RunAll()
     {
         for (int i = 0; i < 10; i++)
             Task.Factory.StartNew(() => Run());
     }

     public void Run()
     {
         PageQueue pq = new PageQueue();
         pq.Add(1, new Page());

         pq.GetAndRemove(1);
     }
 }

正如@Femaref 正确指出的那样,您的代码中存在一些缺陷。我建议您利用以下提供的许多方法并发字典使您的代码线程安全,而不需要lock声明:

public class PageQueue
{
    private ConcurrentDictionary<int, ConcurrentQueue<Page>> pages =
        new ConcurrentDictionary<int, ConcurrentQueue<Page>>();

    public void Enqueue(int id, Page page)
    {
        var queue = this.pages.GetOrAdd(id, _ => new ConcurrentQueue<Page>());

        queue.Enqueue(page);
    }

    public bool TryDequeue(int id, out Page page)
    {
        ConcurrentQueue<Page> queue;

        if (this.pages.TryGetValue(id, out queue))
        {
            return queue.TryDequeue(out page);
        }

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

ConcurrentDictionary 和 ConcurrentQueue 的这种组合是线程安全的吗? 的相关文章

  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 修改Xcode的project.pbxproj中的PRODUCT_BUNDLE_IDENTIFIER

    我正在尝试修改project pbxprojXcode 项目的文件使用sedMac 终端上的 shell 命令用于替换字符串 我想更换字段 PRODUCT BUNDLE IDENTIFIER com example 71b9b4f2 to
  • Pyomo:从 Python 代码访问解决方案

    我有一个想要求解的线性整数程序 我安装了求解器 glpk 感谢这个答案 和pyomo 我写了这样的代码 from pyomo environ import from pyomo opt import SolverFactory a 370
  • 更改Python循环中的步骤[重复]

    这个问题在这里已经有答案了 在Python 2 7中我想修改a的步骤for根据循环中满足的具体条件进行循环 像这样的东西 step 1 for i in range 1 100 step if step 1 do stuff else st
  • 正则表达式删除 Javascript 中的空格、空行和最后换行符

    好吧 伙计们 我在正则表达式方面遇到了困难 这就是我需要的 获取一个文本文件 删除所有空行以及这些行开头和结尾的空格 要删除的空行还包括文件末尾可能的空行 a n在全文的最后 所以我的脚本是 quotes replace s r n gm
  • 我可以向 Mercurial 命令模板添加自定义颜色吗?

    我想使用定制模板hg log看起来像这样 hg log template node short desc date age by author n color always 默认终端颜色的可读性不太好 所以例如我想将节点设为红色 将 des
  • 在 ASP.Net Core 中发布表单数据时出现 400 状态错误 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在开发一个 ASP Net Core 2 0 应用程序并在 Linux Nginx Kestrel 上运行它 在开发环境 Windows 10 上一切运行顺利 此外 在项目目录中使用
  • 托管和设置自己的闪亮应用程序,无需闪亮服务器

    我正在尝试为我的同事提供闪亮的应用程序 而他们无需运行甚至无需安装 R 所以我读了这个网页并找到了这句话 如果您熟悉网络托管或有权访问 IT 部门 您可以自己托管您的 Shiny 应用程序 在下面 分享为网页 部分 我怎样才能做到这一点 问
  • Try It 演示中的 Google Drive SDK 更新(删除/插入)所有者权限 500 错误

    我正在开发一个应用程序 它应该为 Google Apps 管理员提供重新分配文件所有权的能力 目前我正在使用 Google Drive SDK for NET 和 C 代码 当我在 Google Drive SDK 测试演示中进行身份验证时
  • 如何在 Twig 中使用 sprintf 格式化数字?

    我需要格式化一个数字 在 PHP 中 我会使用sprintf 05d lineNumber 在 Symfony 2 Twig 模板中 我应该使用什么代码 If i之前是 4 然后将其添加到 Twig 模板后 02d format i 它将成
  • 找出 ASP.NET 身份验证票证过期的原因

    我需要帮助弄清楚为什么我的身份验证票证在我的托管网站上大约一个小时后就过期了 但是 如果我在本地运行该站点 身份验证票证将在正确的时间内保持活动状态 这是我的本地主机 web config
  • Steam 市场货币和 XML 格式

    我试图在市场上以某种货币获取商品页面 尝试添加 Accept Language ru RU r n and Accept Language ru RU ru r n and Accept Language ru ru RU q 0 8 r
  • git 清理旧分支

    我想创建一个 git 命令来删除当前分支中包含所有提交的任何分支 例如 git branch groups master git cleanup branches deleted groups all commits are include
  • 删除向量开头和结尾的零

    我有一个像这样的向量 x lt c 0 0 0 0 4 5 0 0 3 2 7 0 0 0 我只想保留位置 5 到 11 的元素 我想删除开头和结尾的零 对于这个向量来说 这很容易 因为它很小 我有非常大的数据 需要所有向量的通用信息 尝试
  • PostgreSQL 忽略时间戳列上的索引

    我创建了下表和索引 CREATE TABLE cdc auth user cdc auth user id bigint NOT NULL DEFAULT nextval cdc auth user id seq regclass cdc
  • 使用键盘快捷键打开浏览器操作的弹出窗口

    我正在开发一个带有浏览器操作弹出窗口的 Google Chrome 扩展程序 当用户单击该图标时 会出现弹出窗口 Is there a way to open this popup with a keyboard shortcut like
  • 如何检查 zip 存档中是否存在文件

    我有 zip 存档 解压后我需要检查 zip 存档中是否存在 moduleConfig xml 我怎样才能做到这一点 我试试这个 zip new ZipArchive if zip gt open test zip TRUE if file
  • 获取 SQL Server 2000 中最后插入的 UNIQUEIDENTIFIER

    The OUTPUT子句与 SQL Server 2005 兼容 但与 SQL Server 2000 不兼容 如何将此命令转换为在 SQL Server 2000 中工作 CREATE TABLE sample ID uniqueiden
  • 线程接收错误参数

    我需要在线程中运行具有给定参数的方法 我注意到当我运行它时 参数错误 对于给出的示例 我有一个数组int output与数字1 7 对于每个数字 我使用以下方法创建一个线程WriteInt i 我希望输出以任意顺序为 1 7 但我始终看到一
  • AWK 输出到 bash 数组

    我试图将一个简单命令的内容放入 bash 数组中 但是遇到了一些麻烦 df h awk print 5 6 给出我的系统上文件系统的使用百分比 输出看起来像这样 1 dev 1 dev shm 1 var run 0 var lock 22
  • ConcurrentDictionary 和 ConcurrentQueue 的这种组合是线程安全的吗?

    我在以下代码中使用 NET 4 中的 ConcurrentDictionary 和 ConcurrentQueue 类 这段代码是线程安全的吗 如果不是 我怎样才能使其线程安全 public class Page public string