1

xlib と cairo を使用してプログラムを開発しました。参考までに、cairo と xlib の呼び出しを混在させていますが、それがエラーの原因であるかどうかはわかりません。状況によっては、デッドロックまたはブロックが発生します。xlib で動作する 3 つのスレッドがあります。1 つは xlib と cairo の両方を呼び出すメインの UI スレッドで、もう 1 つは XClientMessage を送信するためだけにそれを使用し、3 番目は XCopyArea のような xlib 呼び出しを行い、最後に XClientMessage を送信します (これらはいくつかのアニメーション用です)。プログラムの冒頭で InitThreads を呼び出しました。また、すべての xlib 呼び出しを XLockDisplay で保護しました (cairo 呼び出しも XLockDisplay で保護されています)。ubuntu 10.10 を使用しています。スタック トレースは次のとおりです。

(gdb) スレッド 1
__kernel_vsyscall () の 0
/lib/tls/i686/cmov/libc.so.6 からの poll ( ) の 1
?? の 2 () /usr/lib/libxcb.so.1 から
3 in ?? () /usr/lib/libxcb.so.1
から xcb_writev で 4 () /usr/lib/libxcb.so.1 から _XSend () で
5 /usr/lib/libX11.so.6 から _XEventsQueued () で
6 /usr/lib/libX11.so.6 から
7 XPending () から /usr/lib/libX11.so.6
(gdb) スレッド 6
0 __kernel_vsyscall ()
で 1 __lll_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 から
/usr/lib/libX11.so.6
(gdb) の XLockDisplay () の 5 (gdb) スレッド 7
__kernel_vsyscall () の 0
__lll_lock_wait () の 1 /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 in XLockDisplay () /usr/lib/libX11.so.6 から
スレッド 1 はメインの UI スレッドで、現在イベント ループで XPending を呼び出しています (すでに XLockDisplay を呼び出しています)。 XSendMessage を呼び出します (スレッド 1 が終了するのをスレッド 7 と共に待機しています)。しかし、スレッド 1 は決してポーリングから戻らないようです。関連性があるかどうかはわかりませんが (Linux や libc の専門家ではありません)、別のスレッドがポーリングで待機しています (これは TCP/IP ネットワーク通信用のスレッドです) (gdb) thread 2
0 in /lib/tls/i686/cmov/libc.so.6 からの__kernel_vsyscall ()
poll () の 1
同様のデッドロック/ブロックを経験した人はいますか? これは xcb のバグでしょうか? xcb なしで xlib をコンパイルしてみる価値はありますか? ありがとう

4

1 に答える 1

0

トラブルメーカーとしても __lll_lock_wait () に 1 があるという問題に遭遇しました。それは私のコードの I/O 部分にありました。おそらくあなたの問題はそこにありますか?

于 2011-05-04T18:40:39.003 に答える