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

标签 c multithreading sockets pthreads

我正致力于提高在 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/

相关文章:

C:错误端口上的套接字绑定(bind)

php - 无法从PHP代码连接到unix :///var/run/docker. socks (权限被拒绝)

c# - 具有异步套接字的C#游戏客户端

c - 为什么递增数组名称时没有 'l-value required' 错误

c - 使用 MPI 或 openMP 在 c 中进行循环并行化的最佳方法

c - 使用<stdatomic.h>在C11 GCC中使数据读写原子?

java - 为每个对象实例分配唯一编号

c - 如何解决 C 和函数指针中的循环依赖问题

c - 分配对象的严格别名规则

java - ActiveMQ 传输线程在 main 结束时不会终止