从/向一个发送者/接收者并发接收/发送
Posted
技术标签:
【中文标题】从/向一个发送者/接收者并发接收/发送【英文标题】:Concurrent receiveing/sending from/to one sender/receiver 【发布时间】:2011-09-07 16:55:08 【问题描述】:我想知道是否可以同时接收来自一个发送者的消息,并以其他方式同时发送给一个接收者。如果是,它将如何表现?
为了让问题更清楚,假设我们有 4 个线程,每个线程都在监听来自同一来源的消息
MPI_Recv(buf, count, type, THE_SAME_SOURCE, tag, status)
所有这些线程都在同一个 MPI 进程中,因此它们都具有相同的 MPI 等级。而来自其他 MPI 进程或相同但来自不同线程的人称为 MPI_Send。是每个接收者都收到相同的消息,还是只收到一个,或者抛出一些异常(发生错误)?
反过来说,如果 4 个线程(是否在同一个 MPI 进程中)向一个接收者发送消息,该接收者也可能在同一个 MPI 进程中,也可能不在同一个 MPI 进程中。是否收到所有消息?
我对 MPI 没有丰富的经验,回答上述问题可能对我有很大帮助。
谢谢
【问题讨论】:
【参考方案1】:接收按注册顺序进行处理。永远不会有“同时”的情况,因为它们是同步的。
Description of Point-To-Point Communication Semantics
因此,在第一种情况下,这意味着当四个线程等待接收时发生的一次发送将被发送到第一个注册接收的线程,其他线程将继续等待后续消息。
在第二种情况下,同样没有“同时”。第一个发送消息的线程将是接收线程接收到的线程。其他发送不会注册接收者。
【讨论】:
这是对这个问题的一个很好的回答。为链接 +1。 这不是与链接所说的多线程执行相反吗?它指出“[...] 类似地,如果逻辑上并发的两个接收操作接收两个连续发送的消息,那么这两个消息可以按任一顺序匹配两个接收。”我读它的方式我们不知道哪个线程的接收会“获胜”。我错了吗?编辑:我的引用也确实说两个接收操作确实可以在逻辑上并发(即“同时”)。 @Quantumboredom:我可以看到链接所说的内容可能令人困惑。引用和周围的段落指出,当您有两个没有任何外部序列点的线程时,您就没有任何定义的发送和接收顺序。有时您运行并且一个会击败另一个,并且其他时候可能是另一种方式。我的观点是它们实际上是在幕后同步的,所以它们永远不会“同时”发生。换句话说,我的观点是总会有第一个,行为是由那个顺序定义的。 @Quantumboredom:大约有两个接收,区别在于物理并发和逻辑并发。该程序可能没有定义特定的顺序,因为它可能只是让线程运行并随时调用。转换为像 pi 演算这样的多线程逻辑,如果它们可能一起发生,它们将被称为并发。然而,实际的调用,即使发生在不同的处理器或内核上,也会有一个获取首先接收的事务并相应地放入队列中。他们可能都在等待,但行为总是被定义的。 感谢您的澄清,我同意:)以上是关于从/向一个发送者/接收者并发接收/发送的主要内容,如果未能解决你的问题,请参考以下文章
从 iPhone 向多个控制器的 Watch 发送和接收消息