Xlib:多线程上的分段错误

时间:2018-12-14 08:54:06

标签: c++ animation segmentation-fault pthreads xlib

我的尝试是编写一个Xlib包装器,以实现三重缓冲方法。一个人只需要使用它来计算他们的显示矩阵,然后将其转发到API进行显示。我有两个单独的线程来处理事件和显示。事件线程似乎可以毫无问题地执行,但是,与标准Xlib函数(如XDrawRectangle,XFillArc,XSetForeground等)一起使用时,显示线程似乎会导致未知的分段错误。

这是我的线程执行部分:

int startx(){
    pthread_t eventsThread, displayThread;
    char msg1[15] ="Events Thread", msg2[15] = "Display Thread";
    int pid1, pid2;
    pid1 = pthread_create( &eventsThread, NULL, eventsHandler, (void*) msg1);
    pid2 = pthread_create( &displayThread, NULL, displayHandler, (void*) msg2);
    pthread_join(eventsThread, NULL);
    pthread_join(displayThread, NULL); 
    return 0;
};

这是我的displayHandler:

void *displayHandler(void* args){
    cout<<connectionNumber<<endl;
    Color c(50,50,250);
    int width = 40, height = 60,x = 500, y = 100;
    for(int i=0;i<1300;i++){
        XSetForeground(display, xgraphics, c.decimal);
        XDrawRectangle(display, mainWindow, xgraphics, x, y, width, height);
        XFlush(display);
    }
}

eventsThread似乎正在执行而没有错误。另外,我尝试使显示功能成为主程序的一部分,结果相同。

如果有人可以告诉我一种使用矩阵绘制窗口的替代/正确方法,那将是万分感谢。

注意:颜色是一个自定义类,可简化颜色计算。

2 个答案:

答案 0 :(得分:0)

这对我来说在howdy行之前崩溃了。取消对return NULL;行的注释会使它起作用。

#include <iostream>
#include <pthread.h>

void *displayHandler(void* args) {
    char* txt = reinterpret_cast<char*>(args);
    std::cout << txt << "\n";
    // return NULL;
}

int startx(){
    pthread_t displayThread;
    char msg2[15] = "Display Thread";
    int pid2;
    pid2 = pthread_create( &displayThread, NULL, displayHandler, (void*) msg2);
    pthread_join(displayThread, NULL);
    return 0;
}

int main() {
    startx();
    std::cout << "howdy\n";
}

答案 1 :(得分:0)

正如Ted Lyngmo指出的那样。问题在于Xlib没有实现用于写入显示的线程安全性。因此,编写互斥量可以提供解决方案。

如果将任何事件掩码设置为写入屏幕,则这两个事件的单独线程将变得毫无意义。代替使遮罩切换变量,而允许它们同时工作。