我正致力于提高在 Linux 系统上运行的用 C 编写的网络应用程序的性能。
现在编写的程序从套接字接口(interface)读取数据包,对其进行一些处理,然后将其添加到发送队列。
我是多线程编程的新手,但我熟悉基本概念(互斥锁、条件信号等)。 我正在尝试实现一个解决方案,其中一组工作线程传递从接口(interface)读取的内容,然后它们执行后续工作。
我的问题是,如果第一个线程读取第一个数据包而第二个线程读取第二个数据包,我如何确保将数据包添加到发送队列的顺序与读取的顺序相同。
最佳答案
有很多方法可以解决这个问题。不同的方式有不同的权衡。需要考虑的是,如果您想要静态数量的工作线程、工作线程的数量,以及您希望解决方案的完美程度。
如果所有工作线程都通过调用read
或recv
直接接收它们的数据包,那么:
pthread_mutex_lock(&the_mutex);
do
{
read_size = read(sock, buf, buf_size);
if (read_size > 0)
{
my_count = ++packet_counter;
break;
} else
{
// figure out how to handle different failures here
}
} while (1);
pthread_mutex_unlock(&the_mutex);
results = do_work(buf, read_size);
enqueue_results(my_count, results);
可行,其中 enqueue_results()
会将结果放入一个优先级队列中,该队列可以处理 key 的回绕(这并不难,因为您只需按 命令last_sent_count-this_count
而不是直接使用 this_count 进行队列排序)。
然后另一个线程将需要等待下一个回复被发送以准备好并发送它。
您可能会变得更漂亮,但您应该尝试一下。
关于c - 如果多个线程并行处理,如何维护数据包的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060737/