即使每个线程的每个连接,Xlib也会失败(分段错误)

时间:2015-05-30 18:13:34

标签: multithreading x11 xlib

据我所知X11与Xlib一样,有多线程的程序员有2个选择

  1. 尽早打电话给XInitThreads
  2. 或每个线程使用新连接(XOpenDisplay)。
  3. 假设我不喜欢第一个使用XInitThreads()调用的方法。为什么第二次失败?

    #include <X11/Xlib.h>
    #include <thread>
    
    
    void startBasicWin() {
        Display *display;
    
        if ( (display=XOpenDisplay(NULL)) == NULL )
        {
            fprintf( stderr, "cannot connect to X server\n");
            exit( -1 );
        }
        XCloseDisplay(display);
    }
    
    int main() {
        std::thread t3 = std::thread(startBasicWin);
        std::thread t4 = std::thread(startBasicWin);
        std::thread t5 = std::thread(startBasicWin);
        std::thread t6 = std::thread(startBasicWin);
        std::thread t7 = std::thread(startBasicWin);
        std::thread t8 = std::thread(startBasicWin);
        std::thread t9 = std::thread(startBasicWin);
        t3.join();
        t4.join();
        t5.join();
        t6.join();
        t7.join();
        t8.join();
        t9.join();
    }
    
    编译用     g ++ -o xlib_multi xlib_multi.cpp -lX11 -std = c ++ 11 -pthread -g

    有时会产生输出:

    Segmentation fault
    

    No protocol specified
    cannot connect to X server :0
    

    可以,没有线程同步我不能使用XOpenDisplay()吗?但是一旦使用Xlib创建X11连接,我可以在多线程环境中使用Xlib而不会出现任何问题?这样的假设是否正确?

    或者Xlib是否还有多线程的错误?

1 个答案:

答案 0 :(得分:0)

有可能XOpenDisplay()在内部使用一些非线程安全的全局变量或在显示之间共享数据。我认为从一个线程中调用XOpenDisplay是不明智的。我建议先按顺序打开显示,然后用Display指针启动线程。或使用互斥锁保护XOpenDisplay(和XCloseDisplay!)周围的代码部分。

无论哪种方式,存在单独的XInitThreads()调用的事实使得您假设“在XOpenDisplay()之后一切都会很好”。