我在弄清楚这一点时遇到了问题。
我有两个线程,一个执行如下(T1a,T1b,T1c)第二个(T2a,T2b,T2c)
假设 T1a 应该在 T2a 之前启动,并且 T1 和 T2 在两台远程机器上并且需要网络通信(TCP 套接字)。
如何在这两个线程之间建立同步(假设每个线程都有一个函数 T1() 和 T2() ),并且连续执行是平凡的, T1a < T2a < T1b < T2b < T1c < T2c
我在弄清楚这一点时遇到了问题。
我有两个线程,一个执行如下(T1a,T1b,T1c)第二个(T2a,T2b,T2c)
假设 T1a 应该在 T2a 之前启动,并且 T1 和 T2 在两台远程机器上并且需要网络通信(TCP 套接字)。
如何在这两个线程之间建立同步(假设每个线程都有一个函数 T1() 和 T2() ),并且连续执行是平凡的, T1a < T2a < T1b < T2b < T1c < T2c
这是一个技巧问题吗?看起来像是自 70 年代以来您在大量守护进程中发现的基本命令循环的一个特定案例。
您只需让每个子任务发送一条消息(通过您的 UDP 套接字或任何其他通信方式)到远程机器,让下一个任务开始。
每个“功能”(Txy)都将具有类似的结构
wait for a message signalling previous task completion
do my job
send another message to signal task completion
您实际上不需要编写 3 个函数。分析消息并采取适当行动的单个函数将更易于维护且更健壮:
forever
wait for a command
execute the corresponding action
possibly send a new message to trigger an action on peer side
您最好为消息接收添加超时,以防止在其中一台计算机崩溃或连接中断时系统卡住。跟踪下一个预期命令以确保按预期顺序执行操作也是明智的:如果其中一个同步消息丢失会发生什么?
但是,我看不出同步彼此之间没有依赖关系的任务有什么意义。
通常,您只需要在给定任务需要前一个任务的输入时才需要这样做。例如,从 Internet 上获取一些数据并将其传递给其他计算机进行处理。
换句话说,消息通常会包含执行下一部分处理所需的一些数据。