tnasrevid

ncurses & pthreads

02.07.2009, 10:46. Показов 3247. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу программу с использованием ncurses и pthread.
Нужно выводить в двух разных окошках работу потоков.
Проблема в том, что программа работает нормально только тогда, когда в окно выводит только один поток. Если раскомментировать строки запуска второго потока, программа выводит на терминал "мусор" и вылетает с "Segmentation fault".

Копмиляция:
gcc prog1.c -D_REENTERANT -I/usr/include/nptl -L/usr/lib/nptl -lncurses -lpthread -o prog1

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//************ prog1.c *************
 
#include <ncurses.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
 
WINDOW *win1, *win2, *subwin1, *subwin2, *subwinstd;
pthread_t tid1, tid2;
int rez;
 
void endncurses();
void *funct1();
void *funct2();
 
main(int argc, int *argv[])
{
initscr();
cbreak();
noecho();
curs_set(0);
 
start_color();
init_pair(1, COLOR_GREEN, COLOR_BLACK);
bkgd(COLOR_PAIR(1));
box(stdscr, ACS_VLINE, ACS_HLINE);
refresh();
 
win1 = newwin(12, 25, 2, 2);
wbkgd(win1, COLOR_PAIR(1));
box(win1, ACS_VLINE, ACS_HLINE);
subwin1 = subwin(win1, 10, 23, 3, 3);
scrollok(subwin1, TRUE);
wrefresh(win1);
 
win2 = newwin(12, 25, 2, 32);
wbkgd(win2, COLOR_PAIR(1));
box(win2, ACS_VLINE, ACS_HLINE);
subwin2 = subwin(win2, 10, 23, 3, 33);
scrollok(subwin2, TRUE);
wrefresh(win2);
 
// thread #1
if ((rez = pthread_create(&tid1, NULL, funct1, NULL)) != 0)
    {
    endncurses();
    printf("Error create thread #1\n");
    exit(0);
    }
 
// thread #2
//if ((rez = pthread_create(&tid2, NULL, funct2, NULL)) != 0)
//  {
//  endncurses();
//  printf("Error create thread #2\n");
//  exit(0);
//  }
 
 
getch();
endncurses();
return 0;
}
 
void endncurses()
{
delwin(subwin2);
delwin(subwin1);
delwin(win2);
delwin(win1);
erase();
refresh();
endwin();
}
 
void *funct1()
{
int j;
j = 0;
while (1)
    {
    wprintw(subwin1, "Thread #1 --- %d\n", j);
    wrefresh(subwin1);
    j++;
    }
}
 
void *funct2()
{
int k;
k = 0;
while (1)
    {
    wprintw(subwin2, "Thread #2 --- %d\n", k);
    wrefresh(subwin2);
    k++;
    }
}
Подскажите, как решить?..
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2009, 10:46
Ответы с готовыми решениями:

Ncurses & Mouse position
Все доброго времени суток! Я недавно столкнулся с одной проблемой в ncurses, на linux'e. Мне надо было написать прогу, которая постоянно...

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume WHERE ' &amp; ''' &amp;...

error '80020009' &Icirc;&oslash;&egrave;&aacute;&ecirc;&agrave;. /lalala/profile.asp, line 28
При простейшем и сто раз работавшем скрипте, вылетает ошибка! след. содержания error '80020009' ...

3
14 / 14 / 0
Регистрация: 08.07.2009
Сообщений: 61
08.07.2009, 16:39
Наиболее вероятно, что вываливается из-за гонки потоков за доступом к одной и той же незащищенной области памяти. Переменные между потоками должны быть разделяемы. Или в случае однвременного обращения они должны становится в очередь. С pthread я так и не работал, слишком сложно и малофункционально, но в других технологиях OpenMP и MPI так делают.
0
tiger710
17.07.2009, 22:50
Проверил действительно вылетает при одновременном доступе потоков к глобальным переменным.
Ниже приведен вариант программы с использованием семафоров, sleep в циклах нужен для того что бы текущий поток передавал управление другому потоку иначе он забирает все ресурсы под себя и второй поток ни когда не получит управление.
Можно запустить программу и без использования семафора, для этого нужно закоментировать все обращения к семафору и раскоментить sleep между созданиями потоков. В этом случае потоки запускаются с задержкой в 1 секунду и после выполнения шага цикла засыпают на 2 секунды, а из-за смещения при запуске не имеют одновременного доступа к переменным.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//************ prog1.c *************
 
#include <ncurses.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>
 
WINDOW *win1, *win2, *subwin1, *subwin2; //, *subwinstd;
pthread_t tid1, tid2;
int rez;
sem_t sem;
 
void endncurses();
void *funct1(void*);
void *funct2(void*);
 
main(int argc, char *argv[])
{
 
    initscr();
    cbreak();
    noecho();
    curs_set(0);
 
    start_color();
    init_pair(1, COLOR_GREEN, COLOR_BLACK);
    bkgd(COLOR_PAIR(1));
    box(stdscr, ACS_VLINE, ACS_HLINE);
    refresh();
    
    win1 = newwin(12, 25, 2, 2);
    wbkgd(win1, COLOR_PAIR(1));
    box(win1, ACS_VLINE, ACS_HLINE);
    subwin1 = subwin(win1, 10, 23, 3, 3);
    scrollok(subwin1, TRUE);
    wrefresh(win1);
    
    win2 = newwin(12, 25, 2, 32);
    wbkgd(win2, COLOR_PAIR(1));
    box(win2, ACS_VLINE, ACS_HLINE);
    subwin2 = subwin(win2, 10, 23, 3, 33);
    scrollok(subwin2, TRUE);
    wrefresh(win2);
    
    sem_init(&sem,0,1);
    
    // thread #1
    if ((rez = pthread_create(&tid1, NULL, funct1, NULL)) != 0)
    {
    endncurses();
    printf("Error create thread #1\n");
    exit(0);
    }
    
    // thread #2
    if ((rez = pthread_create(&tid2, NULL, funct2, NULL)) != 0)
    {
    endncurses();
    printf("Error create thread #2\n");
    exit(0);
    }
    
    getch();
    endncurses();
    return 0;
}
 
void endncurses()
{
    delwin(subwin2);
    delwin(subwin1);
    delwin(win2);
    delwin(win1);
    erase();
    refresh();
    endwin();
}
 
void *funct1(void *a)
{
    int j;
    j = 0;
    while (1)
    {
    sem_wait(&sem);
    wprintw(subwin1, "Thread #1 --- %d\n", j);
    wrefresh(subwin1);
    j++;
    sem_post(&sem);
    sleep(1);
    }
}
 
void *funct2(void *a)
{
    int k;
    k = 0;
    while (1)
    {
    sem_wait(&sem);
    wprintw(subwin2, "Thread #2 --- %d\n", k);
    wrefresh(subwin2);
    k++;
    sem_post(&sem);
    sleep(1);
    }
}
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
05.08.2009, 09:14
Попробуй использовать pthread_mutex_t, pthread_mutex_lock и pthread_mutex_unlock.Это должно решить проблему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.08.2009, 09:14
Помогаю со студенческими работами здесь

Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2
pci\ven_8086&amp;DEV_266E&amp;SUBSYS_A002145&amp;REV_05\3&amp;13C0B0C5&amp;0&amp;F2 Мультимедиа аудиоконтроллер помогите плз найти...

Мультимедиа контролер PCI\VEN_14F1&DEV_8800&SUBSYS_EA3D14F1&REV_05\4&25700A26&0&3020
Помогите пожалуйста найти драйвер на мультимедиа видеоконтролер ...

немогу найти драйвера на PCI\VEN_1039&DEV_7012&SUBSYS_810D1043&REV_A0\3&61AAA01&0&17
Мультимедиа аудиоконтроллер PCI\VEN_1039&amp;DEV_7012&amp;SUBSYS_810D1043&amp;REV_A0\3&amp;61AAA01&amp;0&amp;17

Нужен драйвера, код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17
всем привет !! уменя нет звука нужен драйвер код PCI\VEN_1039&amp;DEV_7012&amp;SUBSYS_0C98105B&amp;REV_A0\3&amp;B1BFB68&amp;0&amp;17 скачал прогу их много ...

Драйвера на PCI\VEN_10B7&DEV_1700&SUBSYS_80EB1043&REV_12\4&2E98101C&0&28 F0
помогите плиз - вот ID: PCI\VEN_10B7&amp;DEV_1700&amp;SUBSYS_80EB1043&amp;REV_12\4&amp;2E98101C&amp;0&amp;28F0 Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru