在我的 HFT 交易应用程序中,我有几个地方可以从网络接收数据。在大多数情况下,这只是一个只接收和处理数据的线程。以下是此类处理的一部分:
public Reciver(IPAddress mcastGroup, int mcastPort, IPAddress ipSource)
{
thread = new Thread(ReceiveData);
s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.ReceiveBufferSize = ReceiveBufferSize;
var ipPort = new IPEndPoint(LISTEN_INTERFACE/* IPAddress.Any*/, mcastPort);
s.Bind(ipPort);
option = new byte[12];
Buffer.BlockCopy(mcastGroup.GetAddressBytes(), 0, option, 0, 4);
Buffer.BlockCopy(ipSource.GetAddressBytes(), 0, option, 4, 4);
Buffer.BlockCopy(/*IPAddress.Any.GetAddressBytes()*/LISTEN_INTERFACE.GetAddressBytes(), 0, option, 8, 4);
}
public void ReceiveData()
{
byte[] byteIn = new byte[4096];
while (needReceive)
{
if (IsConnected)
{
int count = 0;
try
{
count = s.Receive(byteIn);
}
catch (Exception e6)
{
Console.WriteLine(e6.Message);
Log.Push(LogItemType.Error, e6.Message);
return;
}
if (count > 0)
{
OnNewMessage(new NewMessageEventArgs(byteIn, count));
}
}
}
}
该线程一旦创建就永远有效。我只是想知道我是否应该将此线程配置为在某些核心上运行?由于我需要最低延迟,我想避免上下文切换。由于我想避免上下文切换,我最好在同一个处理器内核上运行同一个线程,对吧?
考虑到我需要最低延迟是正确的:
- 为大部分“长时间运行”线程设置“线程亲和力”会更好吗?
- 从上面的示例中为线程设置“线程亲和力”会更好吗?
如果这很重要,我现在将上面的代码重写为 c++,以便稍后移植到 Linux,但是我认为我的问题更多是关于硬件而不是语言或操作系统。