【问题标题】:Implementing pipe using threads in C在 C 中使用线程实现管道
【发布时间】:2020-02-16 17:38:03
【问题描述】:

我正在尝试实现一个具有读取、写入、关闭功能的管道。 我的 main 创建了 2 个线程,一个从数组读取并写入管道,另一个从管道读取并写入标准输出。我使用一个简单的循环缓冲区作为管道,并使用彼得森的算法来同步它们。

我的 main 应该等待它们完成操作或从 stdin 接收“退出”输入,在这种情况下它应该调用 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
}

【问题讨论】:

  • 你尝试了什么?
  • 作为开始,请使用tour 并阅读How to Ask。您的问题还没有准备好在这里提问,因为它非常开放且不具体。
  • 通过“从标准输入获取输入而不阻塞”,你的意思是你想让tty进入原始模式吗?通常,如果您从文件描述符中read,则如果数据可用,则不会发生阻塞。我怀疑您将 stdin 与 tty 混为一谈。不要那样做。

标签: c multithreading algorithm pipe


【解决方案1】:

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

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    假设您不想进入信号和非阻塞 IO,请考虑分叉另一个等待 STDIN 的线程,并通知主三个退出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多