【问题标题】:Threads synchronisation over C socketsC 套接字上的线程同步
【发布时间】:2015-09-06 13:54:44
【问题描述】:

我在解决这个问题时遇到了问题。

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

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

如何在这两个线程之间建立同步(假设每个线程都有一个函数 T1() 和 T2() ),并且连续执行是平凡的,T1a

【问题讨论】:

  • 我很确定在远程机器上运行的进程在任何合理的分类中都不算多线程。

标签: c multithreading sockets synchronisation


【解决方案1】:

这是一个棘手的问题吗?看起来像是自 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 上抓取一些数据并将其传递给其他计算机进行处理。

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

【讨论】:

  • 这是我正在尝试解决的大学练习,它提到两个任务 T1 和 T2 应该同步,可以同时执行,但假设 start(T2a) >= end( T1a) 和开始(T1c) >= 结束(T2b) 。我仍然不明白如何通过套接字进行同步,我应该为此使用互斥锁/信号量吗?或者一个简单的消息信号就可以完成这项工作
  • 嗯,是的。一台计算机将承担主机的角色并向另一台发送命令:发送开始消息,做你的 T1a 事情,等待 T1b 发出完成信号,准备处理下一个段。在奴隶方面:等待主人命令,做你的 T2a 事情,发出工作结束的信号。冲洗并重复。忽略消息传输时间,T1a 和 T2a 将同时执行。两者都完成后,下一步将立即开始。以此类推。
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2018-05-19
  • 2012-07-24
相关资源
最近更新 更多