【问题标题】:如何在 C# 中将 CPU 内核限制为特定线程
【发布时间】:2022-01-22 13:58:27
【问题描述】:

在我的程序中,UDP 数据是定期发送和接收的。如果只有这一个程序在整个计算机上运行,​​结果是正常的。但如果同时进行其他操作(如打开PDF文档),则会影响UDP通信,出现接收超时。通过观察任务管理器,在执行其他操作时,CPU使用率会暂时升高,影响我的程序运行。由于我的电脑是多核的(12核),所以我尝试将我的关键线程绑定到某个核上,但还是不行,其他线程仍然会被系统分配给这个核。

keyThread.IdealProcessor = 9;
keyThread.ProcessorAffinity = (IntPtr)512;

我认为我需要的是将某个 CPU 内核绑定到程序的关键线程,而不是相反。但我没有找到办法。

添加一些关于我的程序的详细信息。

timer.interval = 10;    //10ms
localSocket.Connect(remotePoint);
localSocket.ReceiveTimeout = 10;    //10ms
private void Timer_Ticked() 
{     
    byte[] requestFrame = new byte[1024];     
    requestFrame = frameManager.GenerateFrame();     
    localSocket.Send(requestFrame);     
    try     
    {         
        byte[] responseFrame = new byte[1024];         
        localSocket.Receive(responseFrame);     
    }     
    catch (Exception)     
    {         
        Console.WriteLine("receive timeout");     
    } 
}

我添加新代码将进程的优先级设置为实时,并将线程的优先级设置为最高,但当我在计算机中执行其他操作时(如打开 PDF 文件或打开Chrome),我的程序受到影响。

我观察 Windows 10 的任务管理器,当我执行一个操作(例如打开一个 PDF 文档)时,所有 CPU 内核的使用都会出现一个峰值。我可以指定一个 CPU 内核只为我的程序工作而不被其他程序使用吗?

【问题讨论】:

  • 您如何发送和接收数据包。我们能看到那个代码吗?我们可能能够使用 .NET 任务调度程序来发挥我们的优势,而不是通过手动为线程分配亲和性来做到这一点。 cpu 亲和力也没有保证,执行最终取决于操作系统
  • 接收超时多长时间?是否在毫秒范围内?
  • timer 是什么?是System.Windows.Forms.Timer 控件吗?
  • @TheodorZoulias 不是系统的定时器,是dll文件中提供的定时器,精度为1ms。
  • 此计时器是否提供任何保护以防止 Ticked 事件的重叠调用?

标签: c# multithreading udp threadpool multicore


【解决方案1】:

经验法则:UDP 数据是可能丢失的数据,系统必须设计一种克服这种丢失的方法。否则,将使用其他协议,例如带有内置确认和重试的 TCP,或 SCTP 等。

鉴于此,追求 UDP 稳定性的目标是错误的目标。尽管您付出了努力,但系统迟早会遇到特定 UDP 数据包丢失的情况。也许不是发件人或收件人的错误(原文如此!)。这可能发生在介于两者之间的临时路由器上,因为每个人都同意 UDP 最终会被丢弃。

【讨论】:

  • 是的,我找到了你提到的问题。由于两台电脑是直接连接的,而且线材短于5m,所以数据丢失应该是可以接受的。事实上,我测试过,如果电脑只运行我的程序,数据丢失小于0.01%(实际上不是丢失,只是超时,大部分丢失的数据将在下一个周期接收),这是可以接受的。问题是当同时在计算机中执行另一个操作时,超时事件迅速增加。换句话说,我的程序受到其他应用程序的影响。在 Windows 10 系统中这是正常的吗?
  • 并非所有执行的操作都会影响程序,只有导致cpu使用率达到40%或更多的操作才会影响。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-18
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
相关资源
最近更新 更多