Xlib:多线程上的分段错误
Xlib : Segmentation fault on multithreading
我的尝试是编写一个 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;
};
这是我的显示处理程序:
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 似乎没有错误执行。另外,我试过将显示功能作为主程序的一部分,结果相同。
如果有人能告诉我 alternative/correct 使用矩阵绘制 window 的方法,将不胜感激。
注意:颜色是自制的class,以便于颜色计算。
我在 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";
}
正如 Ted Lyngmo 指出的那样。问题在于 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;
};
这是我的显示处理程序:
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 似乎没有错误执行。另外,我试过将显示功能作为主程序的一部分,结果相同。
如果有人能告诉我 alternative/correct 使用矩阵绘制 window 的方法,将不胜感激。
注意:颜色是自制的class,以便于颜色计算。
我在 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";
}
正如 Ted Lyngmo 指出的那样。问题在于 Xlib 没有为写入显示实现线程安全。所以写一个互斥量提供了一个解决方案。
如果将任何事件掩码设置为写入屏幕,则两者的单独线程将变得毫无意义。而不是让掩码切换变量,让它们同时工作。