【问题标题】:How to maintain order of packets if multiple threads are processing in parallel?如果多个线程并行处理,如何维护数据包的顺序?
【发布时间】:2015-09-12 16:09:27
【问题描述】:

我正在努力提高在 linux 系统上运行的用 C 语言编写的网络应用程序的性能。

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

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

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

【问题讨论】:

  • 这与并行工作的全部意义相矛盾,不是吗?
  • 接收线程应该对数据包进行排序,而不是工人。
  • 处理部分浪费了大量时间,因此如果并行处理多个数据包,则可以节省时间...我的问题是如何以与读取相同的顺序添加结果.. .考虑到处理时间大致恒定
  • 你的数据流有点不清楚。你有一个线程读取数据包,是吗?数据包排队,是吗?处理线程从队列中获取数据包并处理它们,是吗?好的,一旦处理线程处理了数据包,数据包会发生什么?他们去哪儿了?
  • 我的意思是,将序列号添加到数据包结构中,然后使用线程安全容器存储乱序数据包,直到所有先前的数据包都到达,这将非常容易。跨度>

标签: c multithreading sockets pthreads


【解决方案1】:

只需编写您想要的代码。出站数据包可以按顺序插入队列,如果下一个需要发送的数据包不在队列头部,发送方可以等待。

【讨论】:

    【解决方案2】:

    当您说将其添加到发送队列时,您可以控制的另一个线程是否将其从该发送队列中删除以稍后发送,或者这超出了您的控制范围。如果是前者,您可以将priority queue 用于第二个队列,而不是传统的先进先出队列。如果优先级队列的键是某个全局计数器,则发送方将始终提取最小/下一个值。现在,如果该最小值不是下一个值,您可以让从发送者线程中拉出的线程等待下一个值。根据优先级队列的实现,您也可以只查看队列以查看下一个值,然后有条件地等待直到另一个插入队列。

    【讨论】:

      【解决方案3】:

      程序可以为每个线程使用单独的接收和发送队列。接收线程将数据包以循环顺序排队到处理线程。每个处理线程将从其接收队列中取出一个数据包,处理该数据包并将已处理的数据包排队到其发送队列。发送线程将按循环顺序从已处理的发送队列中取出已处理的数据包。

      【讨论】:

        【解决方案4】:

        有很多方法可以解决这个问题。不同的方式有不同的取舍。需要考虑的事情是,您是否希望拥有静态数量的工作线程、工作线程的数量以及您希望解决方案的完美程度。

        如果所有工作线程都通过调用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() 会将结果放入一个优先级队列中,该队列可以处理密钥的环绕(这并不难,因为您只需按 last_sent_count-this_count 订购,而不是直接使用 this_count队列排序)。 然后另一个线程需要等待下一个要发送的回复才能准备好并发送。

        你可以变得更漂亮,但你应该试一试。

        【讨论】:

          猜你喜欢
          • 2013-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-24
          • 2017-01-02
          • 2013-10-20
          相关资源
          最近更新 更多