Ошибка сегментации с многопоточностью (ncurses)
Имея следующую структуру и глобальную переменную:
typedef struct Column{
char * text;
int size;
} Column;
Column * screen;
И эта функция потока:
void * thread_function(void * msg){
Info *mesg = (Info *)msg;
int col = mesg->c;
int count = 0;
while (count < MAX_ELEM){
if (rand() % 2){
screen[col].text[count] = ' ';
screen[col].size++;
count++;
}
else{
screen[col].text[count] = 'a';
screen[col].size++;
count++;
}
}
}
В основной функции после присоединения к потокам я начинаю печатать содержимое screen
int row = 42; // num of rows on the screen
while(true){
int i;
for (i = 0; i<col; i++){
int j = screen[i].size - 1; // print only up to already assign value
int k = 0;
while (j >= 0 && k < row){
mvprintw(k,i,"%c",screen[i].text[j]);
refresh();
j--;
k++;
}
}
refresh();
}
Проблема в том, что некоторые прогоны выполняются нормально, в то время как другие генерируют ошибку ошибки Seg после нескольких итераций while(true)
(Примечание: по крайней мере, что-то всегда печатается). Если я удалю mvprintw()
от while(true)
Ошибка сегмента никогда не возникает. В чем может быть проблема?
Ps Пожалуйста, не публикуйте ответы, связанные с мьютексом, так как это задание, и я бы предпочел исправить возникшую у меня проблему, а скорее переосмыслить идею, особенно когда ее можно выполнить без мьютекса.
Редактирование:
распределение глобальных переменных screen
(часть основного)
screen = malloc(col * sizeof(Column *));
i = 0;
for (; i<col; i++){
screen[i].text = malloc(MAX_ELEM * sizeof(char));
screen[i].size = 0;
}
Экран вывода при сбоях сегмента:
a a Segmentation fault (core dumped)
Экран вывода при отсутствии ошибок:
a a a a a aa
a a a
1 ответ
Почувствуй это
screen = malloc(col * sizeof(Column *));
быть
screen = malloc(col * sizeof(Column));
так как sizeof(Column *)
вернул бы только размер указателя