Multithreading ncurses多线程读写解决方案

Multithreading ncurses多线程读写解决方案,multithreading,ncurses,curses,Multithreading,Ncurses,Curses,这是上面说的 如果您有一个在多个线程中使用诅咒的程序,您几乎肯定会看到奇怪的行为。这是因为curses对输入和输出都依赖于静态变量。使用一个线程进行输入,其他线程进行输出无法解决问题,额外的屏幕更新也无法提供帮助。本FAQ不是关于线程编程的教程 具体地说,它提到即使输入和输出在不同的线程上完成,也不安全。如果我们对整个ncurses库进一步使用互斥锁,这样一次最多只能有一个线程调用任何ncurses函数,这样安全吗?若并没有,那个么在多线程应用程序中安全使用ncurses的其他廉价解决方案是什么

这是上面说的

如果您有一个在多个线程中使用诅咒的程序,您几乎肯定会看到奇怪的行为。这是因为curses对输入和输出都依赖于静态变量。使用一个线程进行输入,其他线程进行输出无法解决问题,额外的屏幕更新也无法提供帮助。本FAQ不是关于线程编程的教程

具体地说,它提到即使输入和输出在不同的线程上完成,也不安全。如果我们对整个ncurses库进一步使用互斥锁,这样一次最多只能有一个线程调用任何ncurses函数,这样安全吗?若并没有,那个么在多线程应用程序中安全使用ncurses的其他廉价解决方案是什么

我问这个问题是因为我注意到一个真正的应用程序通常有自己的事件循环,但依赖ncurses
getch
函数来获取键盘输入。但是如果主线程在自己的事件循环中阻塞等待,那么它就没有机会调用
getch
。一个看似适用的解决方案是在另一个线程中调用
getch
,这还没有给我带来问题,但正如上面所说的,实际上并不安全,并且已被另一个用户验证。因此,我想知道将
getch
合并到应用程序自己的事件循环中的最佳方法是什么

我正在考虑将
getch
设为非阻塞状态,并定期(每10-100毫秒)唤醒主线程,检查是否有内容可读。但这会在关键事件之间增加额外的延迟,并使应用程序响应速度降低。此外,我不确定这是否会导致某些ncurses内部延迟出现任何问题,例如
ESCDELAY

我正在考虑的另一个解决方案是直接投票给stdin。但我想ncurses也应该这样做,从两个不同的地方读同一条流看起来很糟糕


本文还提到了“ncursest”或“ncursestw”库,但它们似乎不太可用,例如,如果您使用的是不同语言的诅咒绑定。如果标准ncurses库中有一个可行的解决方案,那就太好了。

如果没有线程支持,在多个线程中使用curses函数就太不走运了。这是因为大多数curses调用使用静态或全局数据。示例的
getch
函数调用
refresh
,该函数可以使用全局指针
curscr
stdscr
更新整个屏幕。线程支持配置的不同之处在于,全局值被转换为函数并添加互斥


如果您想从不同的线程读取stdin并在一个线程中运行curses,您可能可以通过检查文件描述符来实现这一点(即
0
)用于挂起的活动,并提醒运行curses的线程告诉它读取数据。

也许answer为您提供了一些有用的信息。@fredrik谢谢,我实际上读过这个问题。但正如Thomas所说,这并没有被用户广泛使用。这就是为什么我要问一个标准库的解决方案。另外,我在这里有一个(可能)更简单的要求:我不要求提供完整的多线程支持,但是能够从不同的线程读取stdin就足够了。