Xlib:多线程的分段错误



我的尝试是编写一个Xlib包装器,用于实现三重缓冲方法。使用它,一个人只需要计算他们的显示矩阵,并将其转发给API进行显示。我有两个单独的线程用于处理事件和显示。事件线程的执行似乎没有任何问题,然而,当与XDrawRectangle、XFillArc、XSetForeground等标准Xlib函数一起使用时,显示线程似乎会导致未知性质的分段错误。

这是我的线程执行部分:

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;
};

这是我的显示器处理程序:

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似乎正在执行,没有出现错误。此外,我尝试将显示功能作为主程序的一部分,得到了相同的结果。

如果有人能告诉我一种使用矩阵绘制窗户的替代/正确方法,我将不胜感激。

注意:Color是一个自己制作的类,便于颜色计算。

这对我来说在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 << "howdyn";
}
正如Ted Lyngmo所指出的。问题在于Xlib没有实现用于向显示器写入的线程安全性。因此,编写互斥锁提供了一个解决方案。

如果任何一个事件掩码被设置为写入屏幕,那么这两个掩码的单独线程将变得毫无意义。相反,让掩码切换变量,允许它们同时工作。

相关内容

  • 没有找到相关文章

最新更新