我试图编写代码,其中屏幕分为两个窗口,其中一个由不同的线程修改,但输出似乎非常随机。有人可以帮忙吗?上部控制台应由main修改,下部由线程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);
}
答案 0 :(得分:3)
底层的curses / ncurses库不是线程安全的(参见例如What is meant by “thread-safe” code?讨论该术语)。对于curses,这意味着库的WINDOW
结构(如stdscr
)是全局变量,不受互斥或其他方法的保护。该库还具有内部静态数据,这些数据在Windows之间共享。您只能使用以下策略之一获得多线程代码的可靠结果:
ncurses 5.7以及编译可以为reentrant code和一些线程应用程序提供基本支持。为此,它使用包裹在其静态数据中的互斥锁,将全局变量转换为“getter”函数,并添加显式传递许多调用中隐含的SCREEN
指针的函数。有关详细信息,请参阅manual page。
一些ncurses的测试程序说明了线程支持(这些是源代码的test
子目录中的程序):
use_screen
。WINDOW
属性use_window
use_window
答案 1 :(得分:1)
我不确定你想做什么,但这种行为很正常。活动的线程写入窗口,当系统进行任务切换时,另一个线程写入窗口。正常行为是只使用一个写入窗口的线程。其他线程应该只做一些工作。 无论如何,如果您使用多个线程,则必须使用事件,互斥体,队列,信号量或其他方法来同步它们。