使用 pthread 从终端写入和读取

Posted

技术标签:

【中文标题】使用 pthread 从终端写入和读取【英文标题】:Writing and reading from terminal using pthreads 【发布时间】:2013-01-20 01:25:17 【问题描述】:

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

“获取输出设备”(在本例中为标准输出) 给它写信 释放输出设备 冲洗并重复。

另外,我希望用户能够“回复”输出。为简单起见,我将假设在用户对线程的输出给出答案之前不会向终端写入任何新内容,以便仅在用户回复后写入新行等。我已经阅读在等待终端上的用户输入时,ncurses 似乎是解决这个问题的方法。

但是,现在我读到 ncurses 不是线程安全的,我不确定如何继续。我想我可以用互斥锁包装所有与终端相关的东西,但在我这样做之前,我想知道是否有一种更智能、可能更方便的方法来解决这个问题,也许是一个带有条件变量的解决方案?我有点迷路了,所以欢迎任何帮助。

【问题讨论】:

【参考方案1】:

为什么不只拥有一个工作是与终端交互的线程?

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

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

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

【讨论】:

谢谢你,大卫,从高层次的角度来看,这是有道理的。我仍然不确定的一件事是如何真正告诉“终端线程”一个新的回复正在等待,即用户输入了一些东西。你能详细说明一下吗? 终端线程将等待回复,使用阻塞 ncurses 函数。将回复放入结构后,它会发出一个条件变量信号(可能也在结构中),让需要回复的线程知道它已准备好。 再次感谢! :) 我会试试的。【参考方案2】:

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

【讨论】:

请提供此声明的参考。

以上是关于使用 pthread 从终端写入和读取的主要内容,如果未能解决你的问题,请参考以下文章

如何将pthread_t映射到pid(在Linux上)

Linux上的pthread条件变量,奇怪的行为

pthreads 进程未显示在 ps 输出中

c++多线程同时运行两个函数该怎样编程啊?

为啥 CMake 似乎没有使用 add_compile_options 命令应用 -pthread?

AWS RDS 写入器终端节点与读取器终端节点