C套接字上的线程同步

C套接字上的线程同步,c,multithreading,sockets,synchronisation,C,Multithreading,Sockets,Synchronisation,我搞不懂这个 我有两个线程,一个按如下方式执行(T1a、T1b、T1c) 第二个(T2a、T2b、T2c) 假设T1a应该在T2a之前启动,T1和T2在两台远程机器上,并且需要网络通信(TCP套接字) 我如何在这两个线程(假设每个线程都是函数T1()和T2())之间建立同步,并且连续执行是很平常的,T1a

我搞不懂这个

我有两个线程,一个按如下方式执行(T1a、T1b、T1c) 第二个(T2a、T2b、T2c)

假设T1a应该在T2a之前启动,T1和T2在两台远程机器上,并且需要网络通信(TCP套接字)


我如何在这两个线程(假设每个线程都是函数T1()和T2())之间建立同步,并且连续执行是很平常的,T1a这是一个技巧问题吗?看起来像是自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
您最好为消息接收添加一个超时,以防止在其中一台计算机崩溃或连接中断时系统卡住。 最好跟踪下一个预期命令,以确保按预期顺序执行操作:如果其中一条同步消息丢失,会发生什么情况

但是,我看不出同步彼此之间没有依赖关系的任务有什么意义

通常,您只需要在给定任务需要上一个任务的输入时才需要这样做。例如,从互联网上获取一些数据并将其传递给其他计算机进行处理


换句话说,消息通常会包含一些执行下一部分处理所需的数据。

这是一个技巧性问题吗?看起来像是自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
您最好为消息接收添加一个超时,以防止在其中一台计算机崩溃或连接中断时系统卡住。 最好跟踪下一个预期命令,以确保按预期顺序执行操作:如果其中一条同步消息丢失,会发生什么情况

但是,我看不出同步彼此之间没有依赖关系的任务有什么意义

通常,您只需要在给定任务需要上一个任务的输入时才需要这样做。例如,从互联网上获取一些数据并将其传递给其他计算机进行处理


换句话说,消息通常会包含一些执行下一部分处理所需的数据。

这是我试图解决的一个大学练习,它提到两个任务T1和T2应该同步,可以同时执行,但前提是start(T2a)>=end(T1a)和start(T1c)>=end(T2b)。我仍然不知道如何通过套接字同步,我应该为此使用互斥/信号量吗?或者,通过消息发送一个简单的信号就可以很好地完成这项工作。其中一台计算机将担任主机角色,并向另一台计算机发送命令:发送开始消息,执行T1a操作,等待T1b发出完成信号,准备处理下一段。在从机端:等待主命令,执行T2a操作,发出作业结束的信号。冲洗并重复。忽略消息传输时间,T1a和T2a将同时执行。两个步骤都完成后,下一步将立即开始。等等。这是我试图解决的一个大学练习,它提到两个任务T1和T2应该同步,可以同时执行,但给定的开始(T2a)>=end(T1a)和开始(T1c)>=end(T2b)。我仍然不知道如何通过套接字同步,我应该为此使用互斥/信号量吗?或者,通过消息发送一个简单的信号就可以很好地完成这项工作。其中一台计算机将担任主机角色,并向另一台计算机发送命令:发送开始消息,执行T1a操作,等待T1b发出完成信号,准备处理下一段。在从机端:等待主命令,执行T2a操作,发出作业结束的信号。冲洗并重复。忽略消息传输时间,T1a和T2a将同时执行。两个步骤都完成后,下一步将立即开始。等等。我很确定在远程机器上运行的进程在任何合理的分类中都不算多线程。我很确定在远程机器上运行的进程在任何合理的分类中都不算多线程。