我有一个使用xlib和cairo开发的程序。作为参考,我确实在cairo和xlib之间混合调用,尽管我不确定这是否是错误的原因。在某些情况下,我会陷入僵局。我有三个线程可以使用xlib。一个是主UI线程,它同时调用xlib和cairo,另一个线程只使用它发送一个XClientMessage,第三个线程进行一些xlib调用,比如XCopyArea,最后发送一个XClientMessage (它们用于一些动画)。我在节目一开始就给InitThreads打过电话。我还用XLockDisplay保护了所有xlib调用(cairo调用也被XLockDisplay保护)。我用的是ubuntu 10.10。堆栈跟踪如下:
(gdb)线程1
__kernel_vsyscall ()中的0
在/lib/tls/i 686/cmov/libc.so.
2 in?()从/usr/lib/libxcb.so.1
3 in?()从/usr/lib/libxcb.so.1
4在xcb_writev ()中来自/usr/lib/libxcb.so.1
来自/usr/lib/libX11.so.6的_XSend ()中的5
_XEventsQueued ()中的6来自/usr/lib/libX11.so.6
来自/usr/lib/libX11.so.6的XPending ()中的7
(gdb)线程6
__kernel_vsyscall ()中的0
1在__lll_lock_wait ()中
/lib/tls/i 686/cmov/libp线程.so.0
2在/lib/tls/i 686/cmov/libp线程.so.0处的_L_lock_752 ()中
3在/lib/tls/i 686/cmov/libp线程.so.0处的pthread_mutex_lock ()中
4 in ??()来自/usr/lib/libX11.so.6
来自/usr/lib/libX11.so.6的XLockDisplay ()中的5
(gdb)线程7
__kernel_vsyscall ()中的0
1在/lib/tls/i 686/cmov/libp线程.so.0处的__lll_lock_wait ()中
2在/lib/tls/i 686/cmov/libp线程.so.0处的_L_lock_752 ()中
3在/lib/tls/i 686/cmov/libp线程.so.0处的pthread_mutex_lock ()中
4 in ??()来自/usr/lib/libX11.so.6
来自/usr/lib/libX11.so.6的XLockDisplay ()中的5
在事件循环中,线程1是主ui线程,目前正在调用XPending (它已经调用了XLockDisplay),而头7是刚刚发送XClientMessage的线程,线程6是对XCopyArea进行了一些调用并即将对XSendMessage进行调用的线程(它正与线程7一起等待线程1完成)。但是,线程1似乎从未从民意测验中恢复过来。我不确定这是否相关(我绝不是linux或libc方面的专家),但我还有另一个线程在等待投票(它是TCP/IP网络通信的线程) (gdb)线程2
__kernel_vsyscall ()中的0
在/lib/tls/i 686/cmov/libc.so.
有没有人经历过类似的死锁/阻塞?这是否是xcb中的一个bug,是否值得在没有xcb的情况下编译xlib?谢谢
发布于 2011-05-04 18:40:39
我只是遇到了一个问题,__lll_lock_wait ()中的1也是麻烦制造者。这是在我的代码的I/O部分,也许您有问题吗?
https://stackoverflow.com/questions/3904361
复制相似问题