在.NET Core中实现线程绑定核心的自定义线程池技术问询
关于.NET托管线程绑定特定核心的问题
我正在深入研究线程相关知识,目标是实现自定义线程池以适配大型服务器连接场景。目前我正在开发一款支持TCP/UDP、命名/匿名管道的库,核心规划如下:
- 每个CPU核心运行1个线程负责等待输入(核心需求:线程亲和性),每个线程对应1个Socket(已抽象为
Stream以兼容命名管道) - 每个CPU核心运行1个线程负责发送数据(核心需求:线程亲和性),每个线程对应1个Socket(已抽象为
Stream以兼容命名管道)
在4核服务器上,我预期的线程分配逻辑(已抽象为ISequentialDataSource、ISequentialDataSink接口)如下:
Core 0 => SendLoop, ReceiveLoop, ReceiveDeserializationLoop Core 1 => SendLoop, ReceiveLoop, ReceiveDeserializationLoop Core 2 => SendLoop, ReceiveLoop, ReceiveDeserializationLoop Core 3 => SendLoop, ReceiveLoop, ReceiveDeserializationLoop
我认为这种方案能实现最优的数据传输速率,但查阅.NET运行时相关文档后发现,C#托管线程并不直接映射到操作系统原生线程,这直接打乱了我的规划。
我了解到操作系统层面有支持线程亲和性的原生方法:
- Windows:
SetThreadAffinityMaskAPI - Linux:
pthread_setaffinity_npAPI - Android:暂不考虑(项目针对服务器场景,后续会调研是否有pthread相关支持)
另外我也了解到ProcessThread类支持设置亲和性,但它和System.Threading.Thread并不对应,ProcessThread实例只能通过Process.Threads获取并配置。
现在我有几个核心疑问:
- 是否可以将.NET托管线程直接绑定到特定CPU核心?
- 是否有办法找到
System.Threading.Thread对应的操作系统原生ProcessThread? - 如果成功将线程绑定到指定处理器后,能保证该线程仅在目标核心上运行吗?绑定后会有哪些需要注意的行为或限制?
我的项目是MIT协议开源项目:RadFramework.Libraries
内容的提问来源于stack exchange,提问作者Christopher von Blum
相关产品推荐
相关产品推荐

