2010-10-11 83 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