LINUX.ORG.RU

SafeThread ncurses


0

1

Нужно запустить около 100-200 потоков которые будут печатать на экран функцией addch(char ch); ncurses Не потоко-безопасный, потому я использовал мютексы. Вот таким велосипедом.

pthread_mutex_t mutex;
...

void TS_print_char(int x,int y){
// SafeThread функция вывода случайного символа на экран.
pthread_mutex_lock(&mutex);
        move(x,y);
        char ch = get_good_char();
        addch(ch);
        refresh();
pthread_mutex_unlock(&mutex);
}
Код упрощён для опытов, и чтоб отразить суть. Но при большом количестве потоков всё-равно происходят некие исключения. И вываливаются некрасивые белые строки( у меня всё зелёное) . Опытным путём определил что именно в функции addch() Почему? ведь этот код не могут использовать 2 потока! Или операция pthread_mutex_lock(&mutex); не такая уж и атомарная и не может выдержать натиск 100 потоков? Тогда какую систему синхронизации вы посоветуете?


около 100-200 потоков которые будут печатать на экран функцией addch(char ch);

move(x,y);
char ch = get_good_char();
addch(ch);
refresh();

Ох.. а буферизовать никак?

buddhist ★★★★★ ()

100-200 потоков и рефрешить после каждой буквы? Это ты мощно пошутил.

akk ★★★★★ ()

Может тебе весь вывод на экран в отдельный поток вынести?

Обработка интерфейса в отдельном потоке это стандартный паттерн.

true_admin ★★★★★ ()
Ответ на: комментарий от buddhist

К сожалению нужно именно перерисовывать каждый раз после выставления символа. Да это не красиво, но символ должен отобразить сразу после появления. И это должны делать 100 - 200 потоков( в зависимости от ширины консоли). Вы не расскажите подробнее об буферизации. Думал может рефреши вывести в один поток с слипом в 1000 а каждый поток пусть прросто добавляет сколько ему угодно. Но ещё не проверял. Боюсь это не хорошая идея.

vsrmis ()

Автор, ты дурак.

Тебе не нужна многопоточная отрисовка. Совсем.
Блять, вообще. А со 100!! потоками - тем более.

Тем более в твоей школьной поделке с ncurses.

Иди читай как устроены рендереры.

lovesan

anonymous ()
Ответ на: комментарий от anonymous

Без оскроблений обойтись можно. Я изменил программу без многопоточной отрисовки в сто потоков. Теперь 100 потоков занимаются только выведением символа. А отдельный 101 поток обновляет экран каждые n миллисекунд. Но это всё страшно тормозит. Хоть приоритет у обновляющего потока больше чем у рисующих, всё равно он обновляет слишком редко, и рисуется слишком заметными рывками ещё и разной длинны.

vsrmis ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.