Concurrency 同时重新启动多个锁定线程

Concurrency 同时重新启动多个锁定线程,concurrency,pthreads,mutex,Concurrency,Pthreads,Mutex,我目前有N个线程都是开放的udp/tcp连接。当我从任何线程接收到第一个数据包时,主线程(称为N个线程)需要暂停N个线程中的执行,并在恢复N个线程之前做一些工作 我最初的想法是让所有N个线程使用一个公共互斥体,该互斥体等待来自主线程的pthread_cond_广播。据我所知,在调用广播时,所有N个线程都将按照调度程序确定的顺序恢复执行,因为它们都依赖于相同的互斥。然而,我需要它们同时恢复 这就是我的问题的本质: 主线程: //create N threads. Each thread is co

我目前有N个线程都是开放的udp/tcp连接。当我从任何线程接收到第一个数据包时,主线程(称为N个线程)需要暂停N个线程中的执行,并在恢复N个线程之前做一些工作

我最初的想法是让所有N个线程使用一个公共互斥体,该互斥体等待来自主线程的pthread_cond_广播。据我所知,在调用广播时,所有N个线程都将按照调度程序确定的顺序恢复执行,因为它们都依赖于相同的互斥。然而,我需要它们同时恢复

这就是我的问题的本质:

主线程:

//create N threads. Each thread is connected to a different 
//location but uses the same code

//detect that one of the threads has received a packet
//tell all child threads to pause
pauseThreads();

//do some work on the first packet

resumeThreads();

//tell all child threads to resume
子线程代码:

while(true){
  recv() data


  //the other N-1 threads should ideally block here, 
  //since I'd like to process just the 
  //very first packet

  //hopefully pauseThreads() has been called by the main
  //thread by here if the first packet has been received.
  //All threads should block here until the main thread 
  //is done processing the first packet. Once it's done
  //processing, *firstPacket will be false and the if statement 
  //can be skipped over

  //only one thread should ever access this
  if(*firstPacket  /*this is a global variable*/  ){
      //process first packet
      *firstPacket = false;
      //the thread that receives the first packet should block here
  }

  //process same packet data in another format
}
线程需要并发重启的原因是速度是一个问题,我不能等待每个线程逐个完成自己的数据处理。我已经解决了if语句中的阻塞问题,但是我想不出有效地阻塞N-1个线程的方法。

Best 让服务器向udp数据包添加时间戳或序列号

或者 在接收器中,我假设您正好有一个网络适配器,服务器和您之间只有一条路由。否则,数据包可能会被重新排序


因此,在进一步处理之前,我们需要对数据包进行时间/顺序标记。为此使用单个线程,然后将任务的其余部分分配给辅助线程。

为什么要使用所有线程?如果您试图将它们紧密地同步,使它们的行为就像只有一个线程一样。然后考虑使用一个线程。所有的连接都是由同一个实体运行的。数据通过不同的频道广播,但都是相互关联的。如果我在一个线程中完成这一切,我将无法跟上数据传入的速度。我不理解前两条语句,但第三条是关于跟上的。尽可能快:线程数的上限是每个处理器核心一个线程。最佳值通常较低。与您描述的锁定量有关。我建议使用一个线程,不管有多少个处理器核。我只是说,如果可以标记A-Z-A-B的数据在一个通道中,B-C在另一个通道中,等等。所有数据都来自同一个服务,但必须分布在不同的通道中;ie服务运行多个udp连接以广播其所有数据。如果调度器选择自己的顺序,我的程序的效率会大大降低,因为我无法看到不同单元中接收到的内容之间的实时关系。本质上,事情需要根据来自服务的数据进行更新,延迟将是一件坏事。(有很多核心。)最好让服务器向udp数据包添加时间戳或序列号。或者,在接收方中,我假设您正好有一个网络采纳者,并且服务器和您之间只有一条路由,否则数据包可能会被重新排序。因此,在进一步处理之前,我们需要对数据包进行时间/顺序标记。使用单线程进行此操作。总结让服务器提供帮助,或者使用处理器场:首先线程接收和时间戳,然后将任务的其余部分分配给工作线程。