У меня есть программа, разработанная с использованием xlib и cairo.Просто для справки я делаю смешанные вызовы между cairo и xlib, хотя я не уверен, может ли это быть причиной ошибки.В некоторых ситуациях я захожу в тупик или блокирую.У меня есть три темы, которые работают с xlib.Один из них является основным потоком пользовательского интерфейса, который выполняет вызовы как xlib, так и cairo, другой использует его просто для отправки XClientMessage, а третий - для некоторых вызовов xlib, таких как XCopyArea, и в конце отправляет XClientMessage (это для некоторых анимаций).Я вызвал InitThreads в начале программы.Я также охранял все вызовы xlib с помощью XLockDisplay (вызовы cairo также охраняются с помощью XLockDisplay).Я использую Ubuntu 10.10.Следы стека:
(gdb), поток 1
0 в __kernel_vsyscall ()
1 в опросе () из /lib/tls/i686/cmov/libc.so.6
2 дюйма() из /usr/lib/libxcb.so.1
3 в ??() из /usr/lib/libxcb.so.1
4 в xcb_writev () из /usr/lib/libxcb.so.1
5 в _XSend () из /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 в __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
(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 является основным потоком пользовательского интерфейса, который в данный момент вызывает XPending (он имеетуже называемый XLockDisplay) в цикле событий, thead 7 - это поток, который просто отправляет XClientMessage, а поток 6 - это поток, который сделал некоторые вызовы XCopyArea и теперь собирается сделать вызов XSendMessage (он ожидает вместе с потоком 7 длярезьба 1 до конца).Но поток 1 никогда не возвращается из опроса.Я не уверен, что это актуально (я ни в коем случае не эксперт по linux или libc), но у меня есть другой поток, ожидающий в опросе (это поток для связи по сети TCP / IP) (gdb) поток 2
0 в __kernel_vsyscall ()
1 в опросе () из /lib/tls/i686/cmov/libc.so.6
Кто-нибудь испытывал подобные тупики / блокировки?Может ли это быть ошибкой в xcb и стоит ли пытаться скомпилировать xlib без xcb?Спасибо