多线程分段错误(ncurses)

时间:2014-02-12 11:10:05

标签: c multithreading 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++;
        }
    }
}

在我加入线程后的main函数中,我开始打印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();
    }

问题是某些运行正常执行,而其他运行在while(true)的几次迭代后生成Seg错误(注意:至少某些内容始终打印)。如果我从mvprintw()中移除while(true),则不会发生seg错误。可能是什么问题?

P.S。请不要发布与互斥锁相关的答案,因为这是一项任务,我宁愿纠正我的问题,而是重新实现这个想法,尤其是在没有互斥锁的情况下执行它。

编辑:

分配全局变量screen(主要部分)

screen = malloc(col * sizeof(Column *));
i = 0;
    for (; i<col; i++){
        screen[i].text = malloc(MAX_ELEM * sizeof(char));
        screen[i].size = 0;
    }

seg fault的输出屏幕:

                                                              a a             Segmentation fault (core dumped)

无段错误的输出屏幕:

         a                            a  a              a             a     aa
                        a  a                                        a

1 个答案:

答案 0 :(得分:1)

感觉

screen = malloc(col * sizeof(Column *));

screen = malloc(col * sizeof(Column)); 

因为sizeof(Column *)只返回指针的大小