C 使用pthreads从终端读写

C 使用pthreads从终端读写,c,linux,pthreads,posix,ncurses,C,Linux,Pthreads,Posix,Ncurses,我想使用pthreads在C中创建一个多线程应用程序。我想让一些工作线程在后台做一些事情,但是每隔一段时间,他们就必须将一些东西打印到终端上,所以我想他们必须这样做 “获取输出设备”(在本例中为标准输出) 写信给它 释放输出设备 冲洗并重复 另外,我希望用户能够“回复”输出。为了简单起见,我将假设在用户对线程的输出给出答复之前,不会向终端写入任何新内容,因此只有在用户回复后才会写入新行,等等。我已经阅读了在终端上等待用户输入的内容,而ncurses似乎是实现这一点的方法 然而,现在我已经读到

我想使用pthreads在C中创建一个多线程应用程序。我想让一些工作线程在后台做一些事情,但是每隔一段时间,他们就必须将一些东西打印到终端上,所以我想他们必须这样做

  • “获取输出设备”(在本例中为标准输出)
  • 写信给它
  • 释放输出设备
  • 冲洗并重复
另外,我希望用户能够“回复”输出。为了简单起见,我将假设在用户对线程的输出给出答复之前,不会向终端写入任何新内容,因此只有在用户回复后才会写入新行,等等。我已经阅读了在终端上等待用户输入的内容,而ncurses似乎是实现这一点的方法


然而,现在我已经读到ncurses不是线程安全的,我不确定如何继续。我想我可以用互斥体包装所有与终端相关的东西,但在我这么做之前,我想知道是否有一种更聪明、可能更方便的方法来实现这一点,也许是一种带有条件变量的解决方案?我在这里有些不知所措,所以欢迎提供任何帮助。

为什么不让一个线程负责与终端交互

如果其他线程希望发送消息或从终端获得回复,它们可以创建一个反映该请求的结构,获取互斥锁,并将该结构添加到一个链表中。终端线程将遍历链接列表,根据需要输出数据并根据需要获得回复

您可以使用条件变量向终端线程发出信号,表示现在有需要输出的数据。链表中的结构可以包括一个响应条件变量,终端线程可以在收到回复(如果有)时发出信号


对于没有得到回复的输出,终端线程可以在输出其内容后删除该结构。对于得到回复的输出,终端线程可以向对输出感兴趣的线程发送信号,然后让该线程在复制输出后删除该结构。

为什么不让其任务是与终端交互的线程呢

如果其他线程希望发送消息或从终端获得回复,它们可以创建一个反映该请求的结构,获取互斥锁,并将该结构添加到一个链表中。终端线程将遍历链接列表,根据需要输出数据并根据需要获得回复

您可以使用条件变量向终端线程发出信号,表示现在有需要输出的数据。链表中的结构可以包括一个响应条件变量,终端线程可以在收到回复(如果有)时发出信号


对于没有得到回复的输出,终端线程可以在输出其内容后删除该结构。对于得到回复的输出,终端线程可以通知对输出感兴趣的线程,然后让该线程在复制输出后删除该结构。

您可以在终端上使用fprintf。fprintf处理并发问题,比如在写入输出设备之前,它将在stdout上使用互斥锁。

您可以在终端上使用fprintf。fprintf会处理并发性问题,比如在写入输出设备之前,它会在stdout上使用互斥锁。

谢谢你,David,从高层次的角度来看,这是有意义的。有一件事我仍然不确定,那就是如何告诉“终端线程”一个新的回复正在等待,也就是说,用户键入了什么。您能详细说明一下吗?终端线程将使用阻塞
ncurses
函数等待回复。在将回复放入结构中之后,它会发出一个条件变量(可能也在结构中)的信号,让需要回复的线程知道它已经准备好了。再次感谢!)我试试看。谢谢你,大卫,从高层的角度来看,这是有道理的。有一件事我仍然不确定,那就是如何告诉“终端线程”一个新的回复正在等待,也就是说,用户键入了什么。您能详细说明一下吗?终端线程将使用阻塞
ncurses
函数等待回复。在将回复放入结构中之后,它会发出一个条件变量(可能也在结构中)的信号,让需要回复的线程知道它已经准备好了。再次感谢!)我试试看。请为这份声明提供参考。请为这份声明提供参考。