1

我有一个使用 xlib 和 cairo 开发的程序。仅供参考,我确实在 cairo 和 xlib 之间混合调用,尽管我不确定这是否可能是错误的原因。在某些情况下,我会遇到死锁或阻塞。我有三个与 xlib 一起工作的线程。一个是主 UI 线程,它同时调用 xlib 和 cairo,另一个使用它来发送 XClientMessage,第三个调用一些 xlib 调用,如 XCopyArea,最后发送一个 XClientMessage(那些用于某些动画)。我在程序开始时调用了 InitThreads。我还使用 XLockDisplay 保护了所有 xlib 调用(cairo 调用也使用 XLockDisplay 保护)。我正在使用 ubuntu 10.10。堆栈跟踪是:

(gdb)
__kernel_vsyscall () 中的线程 1 0
来自 /lib/tls/i686/cmov/libc.so.6 的 poll () 中的 1
2 在 ?? () 来自 /usr/lib/libxcb.so.1
3 在 ?? () 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 in _XEventsQueued ()从 /usr/lib/libX11.so.6
7 在 XPending () 从 /usr/lib/libX11.so.6
(gdb) 线程 6
0 在 __kernel_vsyscall ()
1 在 __llll_lock_wait () 从
/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 ? ? () 来自 /usr/lib/libX11.so.6
5 在 XLockDisplay () 来自 /usr/lib/libX11.so.6
(gdb) 线程 7
0 在 __kernel_vsyscall ()
1 在 __lll_lock_wait () 来自 /lib/tls/i686/cmov/libpthread.so.0
2 在 _L_lock_752 ( ) 从 /lib/tls/i686/cmov/libpthread.so.0
3 在 pthread_mutex_lock () 从 /lib/tls/i686/cmov/libpthread.so.0
4 在 ?? () 来自 /usr/lib/libX11.so.6
5 在 XLockDisplay () 来自 /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 在__kernel_vsyscall ()
1 in poll () from /lib/tls/i686/cmov/libc.so.6
有没有人遇到过类似的死锁/阻塞?这可能是 xcb 中的错误吗?是否值得尝试在没有 xcb 的情况下编译 xlib?谢谢

4

1 回答 1

0

我刚刚遇到了一个问题,在 __lll_lock_wait () 中也有 1 作为麻烦制造者。那是在我的代码的 I/O 部分,也许你的问题在那里?

于 2011-05-04T18:40:39.003 回答