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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.