据我所知X11与Xlib一样,有多线程的程序员有2个选择
假设我不喜欢第一个使用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是否还有多线程的错误?
答案 0 :(得分:0)
有可能XOpenDisplay()在内部使用一些非线程安全的全局变量或在显示之间共享数据。我认为从一个线程中调用XOpenDisplay是不明智的。我建议先按顺序打开显示,然后用Display指针启动线程。或使用互斥锁保护XOpenDisplay(和XCloseDisplay!)周围的代码部分。
无论哪种方式,存在单独的XInitThreads()调用的事实使得您假设“在XOpenDisplay()之后一切都会很好”。