멀티쓰레드 GTK+ 프로그래밍

대부분의 프로젝트를 GTK+를 이용하지만, 잊어버릴만 하면 부딪히는 문제 중 하나가 바로 멀티쓰레드 프로그램에서 GTK+ 위젯을 다룰때 발생하는 여러가지 현상들이다.

우선 가장 쉽게 만나는 패턴은 XLib에서 Sync 에러를 내면서 프로그램 종료, 아니면 반대로 GUI가 블럭킹되어 아무 것도 동작안하는 현상이다. 그 다음으로는 해제된 위젯에 접근하거나, 아직 초기화가 덜된 위젯에 접근할 경우 발생하는 무수한 오동작 현상이 있지만, 이는 어플리케이션 설계의 문제이기도 하다.

첫번째 패턴은 GTK+를 멀티쓰레드에서 이용할 경우 처음 사용하는 사람은 누구나 만나게 된다. X 윈도우는 프로세스별로 접근은 제어해주지만, 쓰레드별 접근은 제어를 해주지 않기 때문에 이는 상위 라이브러리나 프로그래머가 처리해야 한다는 점을 모를 경우 말이다.

물론 GTK+ 매뉴얼에는 친절하게 설명 이 되어 있다. 시그널 핸들러를 통해 호출되는 콜백 함수는 항상 GDK 쓰레드가 잠겨서 호출되지만, g_idle_add(), g_timeout_add() 등을 통해 호출되는 콜백 함수는 프로그래머가 해주어야 한다. 또한 메인 GTK+ 쓰레드가 아닌 쓰레드에서 GTK+ 위젯을 접근하려면 g_idle_add() 또는 다른 메시징 방식을 이용해 메인 쓰레드에서 처리하도록 하거나, 매번 GDK 쓰레드 잠금/해제를 프로그래머가 해주어야 한다. gtk_main_iteration() 등의 도움을 받기도 한다.

하지만, 내가 말하고 싶은 건, 그럼에도 불구하고 너무 복잡하다. GTK+의 많은 부분을 좋아하지만 이 부분만큼은 정말 GTK+가 알아서 해주면 얼마나 좋을까라는 생각을 몇 년째 하고 있다. 수십 개의 쓰레드가 존재하고, 외부 명령을 호출하여 그 결과를 GUI에 반영하면서 다른 GUI 부분들도 정상적으로 동작해야 하는데, 기능 외적인 부분에 항상 너무 많은 시간이 소모된다. 모든 경우를 위와 같은 방식으로 해결할 수도 없다. 4년 넘게 GTK+ 어플리케이션을 만들어 프로젝트를 진행하고 있지만, 기능이 추가될때마다 똑같은 홍역을 겪고 있다.

이제, 다른 대안을 찾아야 할 시기일까…

comments powered by Disqus

Related