Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在“上运行代码?”;保留“;cpu核心? 简化背景:_C++_.net_Multithreading_Performance - Fatal编程技术网

C++ 是否可以在“上运行代码?”;保留“;cpu核心? 简化背景:

C++ 是否可以在“上运行代码?”;保留“;cpu核心? 简化背景:,c++,.net,multithreading,performance,C++,.net,Multithreading,Performance,我的应用程序运行很多任务。它们中的大多数都是CPU密集型的。 一个任务(实际上是一个在循环中运行的单线程,监听来自网络的数据包)在很大程度上是一个“实时”任务。更有趣的是,该线程是使用pinvoke调用的本机代码 问题是: 当大量流量显示时,任务工作非常努力,并且所有核心都已达到最大值。当这种情况发生时,“实时”线程(在100%cpu内核上运行)开始丢弃数据包,因为它没有足够的cpu时间 问题是: 是否有可能为“实时”线程“保留”一个内核,并将所有其他线程(任务)限制为其他内核 当然,还有其他

我的应用程序运行很多任务。它们中的大多数都是CPU密集型的。
一个任务(实际上是一个在循环中运行的单线程,监听来自网络的数据包)在很大程度上是一个“实时”任务。更有趣的是,该线程是使用
pinvoke
调用的本机代码

问题是: 当大量流量显示时,任务工作非常努力,并且所有核心都已达到最大值。当这种情况发生时,“实时”线程(在100%cpu内核上运行)开始丢弃数据包,因为它没有足够的cpu时间

问题是: 是否有可能为“实时”线程“保留”一个内核,并将所有其他线程(任务)限制为其他内核

  • 当然,还有其他进程正在运行,也会消耗CPU时间,但我们假设它们消耗的资源很少且恒定
  • 这是一个真正的问题,可以通过“投入更多的cpu”来解决。。。没有选择
编辑-回答许多有用的评论:

  • 我们使用WinPcap捕获所有数据包,这些数据包可以是多个
  • “realtime”线程并不是真正的“realtime”(我认为“realtime”是用于进程的-在.NETThreadPriority中使用“Normal”、“overnormal”等)
  • “实时”线程一包接一包地串行调用WinPcap。我们怀疑,由于它已经足够饿了,它无法跟上,WinPcap的缓冲区溢出了

  • 是的。这一概念被称为“处理器亲和力”,存在于进程级和线程级。调用起来有点尴尬,但没什么可怕的:


    请注意,您必须为您看到的所有线程设置关联。然而,你不是线程的唯一创建者,像
    线程池和GC也有一些线程。我不认为处理这些问题是个好主意,但该类不会主动阻止您这样做。

    您可以为进程和线程指定关联掩码。这允许您防止计划程序使用特定的处理器。因此,您可以将一个线程的线程关联掩码设置为单个处理器,并将所有其他线程的线程关联掩码设置为保留处理器以外的所有处理器。由于.net将您与直接创建系统线程隔离开来,因此在所有系统线程上施加必要的掩码实际上并不那么容易

    说服调度程序对关键线程进行特殊处理的另一种方法是提高其优先级。这是一件你应该谨慎和有意义的前瞻性的事情。但是,这是一种更简单的方法,可以确保线程不必等待进程中的其他线程


    也许你的应用程序使用比处理器更少的线程会更好,但是为关键工作创建一个专用线程。这样,您就可以避免任何关联掩码或优先级欺诈,让系统的线程调度程序为您完成工作

    为什么不简单地提高“任务”的优先级?是的-我不明白。侦听网络数据包通常不是CPU密集型的。您有100GB的网络吗?您是否使用UDP或类似的协议来丢失数据包?如果是这样的话,提高网络线程的优先级听起来是一个更好的选择,正如@JoachimPileborg所建议的那样。@JoachimPileborg:如果它真的是一个实时线程(在Windows中),那么你就不能再提高优先级了。但是非实时线程无论如何也不会窃取内核。所以我怀疑这个错误仅仅是因为线程优先级实际上不是实时的。我相信你误解了问题的本质,尽管你的解决方案是正确的。并不是包侦听器线程以100%的速度运行,而是包侦听器线程与其他任务线程共享一个核心,并且CPU不足。所以,把它自己放在一个内核上,让所有其他线程在所有其他内核上运行,将有助于减少数据包丢失,正如你所说的那样。@8位专家-没错。@8答案描述的就是这样做that@seldary据推测,将网络中断处理与专用内核绑定也是必要的。我不相信这样的亲和力旋转会以积极的方式影响总体吞吐量,因为它会将应用程序其余部分可用的内核数量减少一个。如果您尝试这样做,并且它确实提高了总体性能,我很想听听。在信号发出时准备就绪的线程,例如数据可用时的网络线程,通常会获得动态优先级提升,并且应该“立即”运行。我不相信您已经确定了丢包问题的根本原因:(您将如何确保托管进程中的所有本机线程都有必要的掩码?是否有在创建系统线程时可以订阅的通知?@DavidHeffernan否,没有此类通知。创建系统线程时,代码必须这样做,或者您可以定期轮询