两个窗口-一个由线程随机输出修改
Two Windows - one modified by thread random output
我正在尝试编写代码,其中屏幕分为两个窗口,其中一个窗口由不同的线程修改,但输出似乎非常随机。有人能帮忙吗?控制台的上部应由主控台进行修改,下部由螺纹k
进行修改。
#include <stdio.h>
#include <ncurses.h>
#include <unistd.h>
#include <thread>
#define WIDTH 30
#define HEIGHT 10
int startx = 0;
int starty = 0;
void kupa (int score_size, int parent_x, int parent_y)
{
int i = 0;
WINDOW *dupa = newwin(score_size, parent_x, parent_y - score_size, 0);
while(true)
{
i++;
mvwprintw(dupa, 0 , 0, "You chose choice %d with choice string", i);
wrefresh(dupa);
sleep(5);
wclear(dupa);
}
delwin(dupa);
}
int main ()
{
int parent_x, parent_y;
int score_size =10;
int counter =0 ;
initscr();
noecho();
curs_set(FALSE);
getmaxyx(stdscr, parent_y, parent_x);
WINDOW *field = newwin(parent_y - score_size, parent_x, 0, 0);
std::thread k (kupa, score_size, parent_x, parent_y);
while(true) {
mvwprintw(field, 0, counter, "Field");
wrefresh(field);
sleep(5);
wclear(field);
counter++;
}
k.join();
delwin(field);
}
底层的curses/ncurses库不是线程安全的(例如,请参阅讨论该术语的"线程安全"代码的含义)。在curses的情况下,这意味着库的WINDOW
结构(如stdscr
)是全局变量,不受互斥或其他方法的保护。该库还具有跨窗口共享的内部静态数据。您只能使用以下策略之一来获得多线程代码的可靠结果:
- do一个线程内的所有窗口管理(包括输入)
- 使用互斥、信号量或任何看起来最好的并发技术来管理"拥有"独立窗口的独立线程。要在这里取得成功,线程必须拥有整个屏幕,从curses库在等待输入时阻止开始,直到它更新屏幕并继续等待输入。这比听起来更难
ncurses 5.7及更高版本可以编译,为可重入代码和一些线程应用程序提供基本支持。为了做到这一点,它使用包裹在静态数据周围的互斥,将全局变量制成"getter"函数,并添加显式传递SCREEN
指针的函数,这在许多调用中都是隐含的。有关更多详细信息,请参阅手册页面。
ncurses的一些测试程序说明了线程支持(这些程序位于源代码的test
子目录中):
- 同上,显示
use_screen
- test_opaque执行
WINDOW
属性的"getter"> - 降雨显示
use_window
- 蠕虫显示
use_window
我不确定你想做什么,但这种行为很正常。活动线程写入窗口,当系统进行任务切换时,其他线程写入窗口。正常的行为是只使用一个向窗口写入的线程。其他线程应该只做一些工作。无论如何,如果您使用多个线程,则必须使用事件、互斥、队列、信号量或其他方法来同步它们。
相关文章:
- std::mutex 如何防止线程修改?
- 如何进行线程安全shared_ptr修改和访问?
- 修改多线程应用程序中的对象
- 无法修改其他线程中 ref 传递的值
- 如何防止另一个线程修改状态标志?
- 在官方 ZeroMQ 多线程示例的修改版本中崩溃
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 如何从线程修改字符串
- 通过向量迭代,而其他线程可能会对其进行修改
- 通知线程是否始终需要在修改期间锁定共享数据
- 为什么我的变量在单独的线程中修改时没有改变?C++/boost
- 是否可以安全地(读取)从BITSET(C )进行一些访问,该咬合可能会通过其他线程修改
- 如果我制作一个代码,每个线程都会修改数组的完全不同的部分,则将保持缓存相干性
- 两个窗口-一个由线程随机输出修改
- 使用多个线程迭代矢量(无数据共享或矢量修改)
- C++11线程修改std::list
- QThread:从不同线程修改变量的安全方法
- 通过C++从后台线程错误修改自动布局引擎
- 从另一个线程修改向量中指针的数据是否安全
- 如何锁定由属于两个不同类的两个线程修改的数据结构