c - 在 C 中使用线程实现管道
问题描述
我正在尝试实现一个具有读取、写入、关闭功能的管道。我的 main 创建了 2 个线程,一个从数组读取并写入管道,另一个从管道读取并写入标准输出。我使用一个简单的循环缓冲区作为管道,我使用彼得森的算法来同步它们两个。
我的主程序应该等待他们完成操作或从标准输入接收“退出”输入,在这种情况下,它应该调用 pipe_close() 并通过使它们返回来终止 2 个线程
我应该如何在不阻塞的情况下从标准输入获取输入?如何使线程终止?我应该使用 Lamports 算法之类的东西来同步所有 3 个吗?
注意:我不能使用 pthread.h 中的任何函数,除了 create
void *myread(void *par) {
//read char from array store in c
write_to_pipe(c)
}
void *mywrite(void *par) {
read_from_pipe(&c);
//print to stdout
}
main() {
//create threads
//wait until theads return or "quit" is written in stdin, call pipe_close and cause threads to return
}
解决方案
这个问题听起来像学校作业。如果是这样,你应该向老师寻求帮助。
如果不阻塞从 stdin 读取的线程,就无法从 stdin 获取输入。我要做的是为您的循环缓冲区设置两个指针。一个用于标准输入线程,一个用于标准输出线程。在标准输入将数据写入缓冲区后,它应该更新它的指针以指向其最后写入的元素。stdout应该一直等到它看到它的指针小于stdin的指针,在这种情况下,它应该将缓冲区的元素写入stdout并在每次写入后更新自己的缓冲区。
这基本上是 Lamport 的算法,但有两个线程,一个生产者和一个消费者。
当一个线程从缓冲区读取或写入/写入时,您可能需要阻止另一个线程读取/写入,以消除代码中的竞争条件。
希望这可以帮助。
推荐阅读
- reactjs - 在 React Next js 应用程序中单击链接时如何传递状态以打开第二个 Material UI 选项卡
- php - WooCommerce:为什么 `get_billing_first_name()` 返回全名?
- reactjs - 样式 MUI 文本字段占位符
- javascript - express.js 应用程序不显示控制台日志消息
- python - 如何使用 Xpath 抓取 Google 网址(包含和不包含)
- unity3d - 代码中的值更改时检查器不更新
- animation - 如何设置 Svelte + Popper.js + display:none 动画
- python-3.x - 无论如何在android和ios上使用python的manim库吗?
- virtual-machine - 将iso导入虚拟框时,我一直遇到障碍
- python - 在matplotlib中制作移动平均时间序列线图的任何解决方法?