我们试图在ooRexx编程语言中添加一种功能,允许程序员在stdin、stdout和stderr流上发出带有I/O重定向选项的操作系统命令。我们对Windows和所有基于unix的系统都这样做。
我们对这两个环境都进行了设置,并且设置基本上是相同的:
当有大量的数据被写入输入管道以及大量的输出数据时,我们就会遇到停滞问题。如果,当写到stdin时,管道已经满了,我们就会被堵住。然而,如果启动过程也设法填充输出管道,它也会阻塞。结果,整个管道停止运行,所有东西都挂起。我们的代码在试图写入输入管道时被卡住,直到从输入管道读取某些数据为止。在读取某些数据之前,进程一直试图写入输出管道,这是不会发生的,因为对输入的写入会停止。经典的致命拥抱。
我在Windows和Linux上研究了许多不同的非阻塞I/O选项,但到目前为止,还没有发现任何不会导致其他问题的东西,比如丢失的数据。有人对如何管理这件事有什么建议吗?
对于感兴趣的人,这里有一个指向处理Windows端的代码的链接:
这是Linux版本
发布于 2018-04-12 21:17:49
在它的文档中,它看起来像是python 记录类似类型的死锁。。看起来,python源代码 (参见第900行和_communicate)通过创建多个读取器守护进程线程()来处理这个问题,该线程在调用输入管道时从输出管道读取。
虽然这种类型的构造是为更高级别的语言(Python)完成的,但是我认为创建线程来读取输出管道,同时在主程序中写入输入管道是一个很好的方法。尽管我还没有真正使用C++/C中的线程,所以在使用线程时我不能保证它的效率或任何可能的缺陷。
我在使用多线程(一如既往)时可能遇到的一个问题是,您必须通过放置适当的同步代码来确保说明任何可能的数据竞赛。
https://stackoverflow.com/questions/49805783
复制相似问题