并发集合在没有 Thread.Sleep 的情况下消耗了太多 cpu

2023-11-23

两者的正确用法是什么,BlockingCollection or ConcurrentQueue这样您就可以自由地将项目出列,而不会使用线程消耗一半或更多的 CPU 资源?

我使用 2 个线程运行一些测试,除非我的 Thread.Sleep 至少为 50~100 毫秒,否则它总是会占用至少 50% 的 CPU。

这是一个虚构的例子:

private void _DequeueItem()
{
    object o = null;
    while(socket.Connected)
    {
        while (!listOfQueueItems.IsEmpty)
        {
            if (listOfQueueItems.TryDequeue(out o))
            {
                // use the data
            }
        }
    }
}

对于上面的例子,我必须设置一个thread.sleep,这样CPU就不会崩溃。

注意:我也尝试过没有进行 IsEmpty 检查,结果是相同的。


这并不是因为BlockingCollection or ConcurrentQueue,但是 while 循环:

while(socket.Connected)
{
    while (!listOfQueueItems.IsEmpty)
    { /*code*/ }
}

当然会降低cpu的性能;因为如果队列为空,那么 while 循环就像:

while (true) ;

这反过来又会消耗CPU资源。

这不是一个好的使用方法ConcurrentQueue你应该使用AutoResetEvent有了它,每当添加项目时,您都会收到通知。 例子:

private ConcurrentQueue<Data> _queue = new ConcurrentQueue<Data>();
private AutoResetEvent _queueNotifier = new AutoResetEvent(false);

//at the producer:
_queue.Enqueue(new Data());
_queueNotifier.Set();

//at the consumer:
while (true)//or some condition
{
    _queueNotifier.WaitOne();//here we will block until receive signal notification.
    Data data;
    if (_queue.TryDequeue(out data))
    {
        //handle the data
    }
}

为了更好地使用BlockingCollection你应该使用GetConsumingEnumerable()等待添加项目,例如:

//declare the buffer
private BlockingCollection<Data> _buffer = new BlockingCollection<Data>(new ConcurrentQueue<Data>());

//at the producer method:
_messageBuffer.Add(new Data());

//at the consumer
foreach (Data data in _buffer.GetConsumingEnumerable())//it will block here automatically waiting from new items to be added and it will not take cpu down 
{
    //handle the data here.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发集合在没有 Thread.Sleep 的情况下消耗了太多 cpu 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 在 div 中包围希伯来语和英语文本

    我正在尝试在段落中的希伯来语和英语句子周围添加跨度标签 例如 那么 到底怎么样了 会变成 span so span span span span all whats up span span span 我一直在尝试使用正则表达式 但它只是删
  • 将html模板文件合并到一个JS文件中

    我有 HTML 模板文件 下划线模板语法 这些文件以 HTML 格式保存 因此很容易编辑 IDE 语法突出显示 我不想用ajax获取它们 而是将它们全部组合起来并将它们包含为js file 使用 GULP 作为我的任务运行程序 我希望它能以
  • 如何限制通过 cin 输入的字符数?

    我希望限制用户可以输入的字符数 使用cin 例如 我可能希望将其限制为两个字符 我该怎么做 我的代码如下所示 cin gt gt var 您可以使用setw cin gt gt setw 2 gt gt var http www cplus
  • NSPredicate iPhone 3.2 SDK核心数据“IN子句”NSInvalidArgumentException异常

    我有一个收藏Calendar对象并希望通过它们来查询它们service id财产 我在 iPhone 3 2 SDK 上使用 Core Data 和 sqlite calendars是一个 NSArray 结果NSFetchRequest
  • 谁最终决定什么是通用类型?

    我有这个功能 public static T2 MyFunc
  • 在 Plone 构建设置中查找需求规格

    我有一个 Plone 网站 大约 4 2 4 从version txt在根目录中 我想更新到最新版本 我发现这个操作方法 截至目前 4 3 4 我继承了过多的固定版本 这些版本没有记录并且可能已经过时 当评论我的versions cfg u
  • 如何设置 JSplitPane-Divider 折叠/展开状态?

    我有一个带有 JSplitPane 的 JFrame 它是 OneTouchExpandable 我想记住 JFrame 上 JSplitPane 的最后一个分隔符位置 并在重新打开 JFrame 时恢复位置 它工作得很好 但如果用户通过
  • 使用存储库的工作单元模式中的依赖项注入

    我想创建一个工作单元类 以类似的方式包装存储库this 我遇到的问题是尝试通过用 IRepository 接口替换示例中的通用存储库来实现依赖项注入 在链接文章的 uow 中 他们使用 getter 来检查存储库是否已实例化 如果没有则实例
  • npm install puppeteer 显示权限被拒绝错误

    我无法安装puppeteer作为项目依赖项 我尝试重新安装节点 有人知道如何解决这个问题吗 运行 Ubuntu 17 10 x64 sudo apt get purge nodejs curl sL https deb nodesource
  • 新手势 - 从左向右滑动 - 作为旧应用程序中 UINavigationController 中“后退”按钮的快捷方式

    iOS 7 采用了一种新手势 即在屏幕上从左向右滑动作为 UINavigationController 中 后退 按钮的快捷方式 我的应用程序似乎没有免费获取此行为 我需要做什么才能让我的 iOS 应用程序 在 Xcode 4 6 3 中为
  • Android Camera2 API 显示处理后的预览图像

    新的 Camera 2 API 与旧的有很大不同 向管道的用户部分显示操纵的相机帧让我感到困惑 我知道有很好的解释使用 Android L 和 Camera2 API 处理相机预览图像数据但显示帧仍然不清楚 我的问题是 在经过一些处理后 在
  • 用传单绘制特定国家的地图

    我想使用该包leaflet用R绘制特定国家的地图 如意大利 西班牙等 我用函数检查了基本示例setView 我尝试为纬度和经度的 arg 给出两个值的向量 m lt leaflet gt addTiles gt Add default Op
  • NUMA 获取当前节点/核心

    我在 Linux 上使用 libnuma 我的线程应该知道它们正在运行的节点 核心 是否有可能以某种方式获取当前线程的节点 核心 我已经浏览了文档 但没有找到这样的功能 我找到了这个解决方案 include
  • 限制完成时的 IntelliJ IDEA 导入建议

    当我输入需要导入的类的名称时 IntelliJ 会亲切地弹出一个建议列表 然而 大多数时候 这些建议是我永远不想导入的东西 尤其是偶然的 比如java awt 有没有办法防止我永远不会导入的包出现在完成列表中 我已经搜索了这些选项 但没有找
  • 使用 MPI_Bcast 进行 MPI 通信

    我正在尝试使用 MPI Bcast 将消息从根节点广播到所有其他节点 然而 每当我运行这个程序时 它总是在开始时挂起 有人知道这是怎么回事吗 include
  • Cassandra 中的高基数和低基数

    我不断遇到这些术语 high cardinality and low cardinality in Cassandra 我不明白它们到底是什么意思 它们对查询有什么影响以及首选是什么 请举例说明 因为这样很容易理解 X 的基数只不过是组成
  • 使用 powershell 将路径永久添加到 Windows 似乎不起作用

    我跟着这个程序为了使用 powershell 永久添加 SumatraPDF 的路径 链接中的最后几个命令旨在检查路径是否确实已添加 当我使用以下命令访问路径时 get itemproperty path Registry HKEY LOC
  • ggplot2:将不连续的持续时间绘制为条形图

    我使用 ggplot 将各种事件绘制为事件开始的日期 x 轴 和开始时间 y 轴 的函数 数据 代码如下 date lt c 2013 06 05 2013 06 05 2013 06 04 2013 06 04 2013 06 04 20
  • 互补误差函数 erfcf() 的可向量化实现

    互补误差函数 erfc 是与标准正态分布密切相关的特殊函数 它经常用于统计学和自然科学 例如扩散问题 其中需要考虑该分布的 尾部 并使用误差函数 erf 因此不适合 ISO C99 标准数学库中提供了互补误差函数 如下所示 erfcf er
  • 并发集合在没有 Thread.Sleep 的情况下消耗了太多 cpu

    两者的正确用法是什么 BlockingCollection or ConcurrentQueue这样您就可以自由地将项目出列 而不会使用线程消耗一半或更多的 CPU 资源 我使用 2 个线程运行一些测试 除非我的 Thread Sleep