Xlib: ошибка сегментации при многопоточности - PullRequest
0 голосов
/ 14 декабря 2018

Моя попытка написать оболочку 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 выполняется без ошибок.Кроме того, я попытался сделать функцию отображения частью основной программы, с теми же результатами.

Если бы кто-нибудь мог сказать мне альтернативный / правильный метод рисования окна с использованием матриц, это было бы очень полезно.

Примечание: Color - это самодельный класс для простоты вычисления цвета.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Как отмечает Тед Люнгмо.Проблема заключалась в том, что в Xlib не реализована безопасность потоков для записи на дисплей.Таким образом, написание мьютекса представляет собой решение.

Если какая-либо из масок событий установлена ​​для записи на экран, отдельные потоки для обоих становятся бессмысленными.Вместо этого делайте маски для переключения переменных, позволяйте им работать одновременно.

0 голосов
/ 14 декабря 2018

Это вылетает перед строкой 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";
}
...