我在管道中遇到了一个有趣的问题。假设我想模拟管道之间的异步行为,这样我就有一个父进程和多个子进程。父进程和子进程可以相互交谈。但是,我遇到的事情是到目前为止通信是原子的。那就是如果我有一个数据集
- 1。首先创建所有的 child
- 2。通过循环将数据集的 CHUNK_SIZE 数据发送给 child
- 3。 child 做一些计算或什么都不做,然后将其数据传回给 parent
- 4。父级从其子级接收数据
但是,麻烦的是我的通信是原子的,我必须发送我所有的数据然后读取它。发送没有问题,因为 child 几乎是即时读取它,因此不需要担心管道被填满。然而,所有的 child 都完成了他们的工作并返回了他们的数据,但是 parent 在完成发送所有数据之前不会读取它。也就是说,在父级尚未到达步骤4 之前,管道可以在步骤3 期间将其中一个子级填充到父级。避免这种情况的一种方法是发送数据,然后在我们再次发送另一个数据集之前接收数据,但这在某种程度上破坏了整点。另一种方法是再次 fork()
并让另一个 child 处理这个问题。但这只是将问题转移到其他地方。我认为这是我设计的问题,但似乎不可能,因为我在单个进程中的代码必须同时在两个地方! (即 reading
和 writing
数据给 child )。在这种方法中仅使用管道设计“真正的”异步行为是否有任何最佳实践或后见之明?
最佳答案
您可以使用 select 来做到这一点. Select 会在您的任何管道准备好读取或写入时告诉您。
关于c - 使用管道实现异步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120516/