首页 > 解决方案 > 在 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
}

标签: cmultithreadingalgorithmpipe

解决方案


这个问题听起来像学校作业。如果是这样,你应该向老师寻求帮助。

如果不阻塞从 stdin 读取的线程,就无法从 stdin 获取输入。我要做的是为您的循环缓冲区设置两个指针。一个用于标准输入线程,一个用于标准输出线程。在标准输入将数据写入缓冲区后,它应该更新它的指针以指向其最后写入的元素。stdout应该一直等到它看到它的指针小于stdin的指针,在这种情况下,它应该将缓冲区的元素写入stdout并在每次写入后更新自己的缓冲区。

这基本上是 Lamport 的算法,但有两个线程,一个生产者和一个消费者。

当一个线程从缓冲区读取或写入/写入时,您可能需要阻止另一个线程读取/写入,以消除代码中的竞争条件。

希望这可以帮助。


推荐阅读