gpt4 book ai didi

c - 如果多个线程并行处理,如何维护数据包的顺序?

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:42 24 4
gpt4 key购买 nike

我正致力于提高在 Linux 系统上运行的用 C 编写的网络应用程序的性能。

现在编写的程序从套接字接口(interface)读取数据包,对其进行一些处理,然后将其添加到发送队列。

我是多线程编程的新手,但我熟悉基本概念(互斥锁、条件信号等)。我正在尝试实现一个解决方案,其中一组工作线程传递从接口(interface)读取的内容,然后它们执行后续工作。

我的问题是,如果第一个线程读取第一个数据包而第二个线程读取第二个数据包,我如何确保将数据包添加到发送队列的顺序与读取的顺序相同。

最佳答案

有很多方法可以解决这个问题。不同的方式有不同的权衡。需要考虑的是,如果您想要静态数量的工作线程、工作线程的数量,以及您希望解决方案的完美程度。

如果所有工作线程都通过调用readrecv 直接接收它们的数据包,那么:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com