2010-10-11 82 views
1

我有一个使用xlib和cairo开发的程序。仅供参考,我在cairo和xlib之间进行了混合调用,但我不确定如果这可能是导致错误的原因。 在某些情况下,我会遇到死锁或块。 我有三个线程与xlib一起工作。一个是调用xlib和cairo的主UI线程,另一个用于发送XClientMessage,第三个调用xCopyArea,最后发送XClientMessage(用于某些动画)。 我在程序开始时调用了InitThreads。我还用XLockDisplay保护了所有xlib调用(cairo调用也由XLockDisplay保护)。 我使用的是Ubuntu 10.10。 堆栈迹线:xlib/xcb死锁或阻止

(GDB)线程1
0 __kernel_vsyscall()
1民意调查()从/lib/tls/i686/cmov/libc.so.6
2在?? ()from /usr/lib/libxcb.so.1
3 in ?? ()from /usr/lib/libxcb.so.1
4 in xcb_writev()from /usr/lib/libxcb.so.1
5 in _XSend()from /usr/lib/libX11.so.6
6 _XEventsQueued()从/usr/lib/libX11.so.6
7 XPending()从/usr/lib/libX11.so.6
(GDB)螺纹6
0 __kernel_vsyscall()
1在从
/lib/tls/i686/cmov/libpthread.so.0
2 _L_lock_752()__lll_lock_wait()从pthread_mutex /lib/tls/i686/cmov/libpthread.so.0
3 _lock()from /lib/tls/i686/cmov/libpthread.so.0
4 in ?? ()从/usr/lib/libX11.so.6
5 XLockDisplay()从/usr/lib/libX11.so.6
(GDB)螺纹7
0 __kernel_vsyscall()
1 __lll_lock_wait ()from /lib/tls/i686/cmov/libpthread.so.0
2 in _L_lock_752()from /lib/tls/i686/cmov/libpthread.so.0
3 in pthread_mutex_lock()from/lib/tls/i686/cmov/libpthread.so.0
4 in ?? ()from /usr/lib/libX11.so.6
5 in XLockDisplay()from /usr/lib/libX11.so.6
其中线程1是主要的UI线程,当前调用XPending(它已经调用XLockDisplay)在一个事件循环中,thead 7是只发送XClientMessage的线程,而线程6是对XCopyArea进行了一些调用并且现在即将调用XSendMessage的线程(它正在等待线程7的线程1完成)。但是线程1似乎从来没有从轮询返回。 我不确定它是相关的(我绝不是Linux或libc的专家),但我有另一个线程在轮询中等待(这是一个用于TCP/IP网络通信的线程) (gdb)线程2
0 in __kernel_vsyscall()
1 in poll()from /lib/tls/i686/cmov/libc.so.6
有没有人遇到类似的死锁/块?这可能是xcb中的一个错误,是否值得尝试在没有xcb的情况下编译xlib? 感谢

+1

是可以从一个线程运行所有的UI调用呢?分离关切和所有...... – 2010-10-11 07:50:19

回答

0

我只是运行到从 在__lll_lock_wait()有1作为麻烦制造者以及一个问题。那是在我的代码的I/O部分,也许你的问题在那里?

+0

问题是在XServer坠毁(由于有问题的驱动程序)。 xlib永远不会从轮询返回,因为在另一侧没有人 – pevgeniev 2013-02-21 15:57:23