x11 프로그래밍중 thread내에서 UI처리문제입니다.
글쓴이: dndmania@naver.com / 작성시간: 금, 2012/09/07 - 5:23오후
안녕하세요
X11 프로그래밍중 발생한 문제에 대해서 여쭙고자 합니다.
현재 X11/UI 프로그램내에서 쓰레드로 서버를 돌리고 메세지가 오면
UI를 조금 변경하는 작업을 하고 있는데요
쓰레드로 돌린 서버에서 메세지를 받고 메인 UI를 조금 변경하려고 하면
바로 아래와 같은 ERROR 나서 죽네요....
most likely this is a multithreaded client and xinitthreads has not been called.
안드로이드에서도 이와 유사하게 메인스레드가 아닌 sub 스레드에서 UI처리를 하면
error 가 발생해 HANDLER를 통해 메인스레드로 메세지를 전달하는 방향으로 갔었는데
X11 프로그래밍에서는 어떤 방식이 있을까요?
아시는분 답변 부탁드립니다.
감사합니다.
Forums:
[xcb] Unknown request in
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not
been called
[xcb] Aborting, sorry about that.
정확한 로그는 위와 같습니다. ㅜㅜ
XInitThreads 이 함수를 호출하지
XInitThreads 이 함수를 호출하지 않았대요.
This function must be the first Xlib function a multi-threaded program calls, and it must complete before any other Xlib call is made.
매뉴얼에는, 이 함수가 멀티 쓰레드 프로그램에서 가장 첫번째로 호출되어야하고, 다른 xlib 함수가 호출되기 전에 이 함수가 완료되어야한다네요.
한 스레드에서 호출한 Xlib 함수가 완결되기 전에,
한 스레드에서 호출한 Xlib 함수가 완결되기 전에, 다른 쓰레드에서 Xlib 함수가 호출되었기 때문에 생기는 현상으로 알고 있습니다. 개별적인 Xlib 함수는 다수의 X request-reply 의 조합으로 구성되는데, 기본적으로 이 함수가 원자적이지 않습니다. 다른 스레드가 중간에 끼어들 수 있다는 거죠. 최초에 XInitThreads를 호출하게 되면 Xlib 함수 내부에서 lock을 써서 함수가 완결되기 전에 다른 스레드로 문맥이 전환되는 것을 막습니다. 하지만 제가 알기론 Xlib에 버그가 있어서, XinitThreads를 쓰면 XIM과 출돌하거나 하는 문제가 있는걸로 알고 있습니다(몇년전 이야기입니다. 현재는 어떤지 모르겠네요).
다르게 말한다면, Xlib 함수를 쓰는 것을 X라는 공유 자원에 접근하는 거라고 생각하시면 됩니다. 당연히 일반적으로 멀티 쓰레드 프로그램에서 제시하는 해결법을 동일하게 적용할 수 있습니다. lock을 쓰시던지, lock-free하게 설계를 바꾸시던지 등...
익명이시네요 누구신지 궁금합니다 아이디 좀... 저는
익명이시네요
누구신지 궁금합니다 아이디 좀...
저는 두번째 댓글 작성자입니다
댓글 달기