在我的高频交易应用程序中,我有几个地方需要从网络接收数据。大多数情况下,这只是一个仅接收和处理数据的线程。以下是此类处理的一部分:
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,不过我认为我的问题更多与硬件有关,而不是语言或操作系统。