gdk_threads_enter()

GLib の object は全部自動的にロックされるが、GTK ではそうではない。だけど、ちゃんと thread aware な作りになっている。というのを今日はじめて知った。お恥ずかしい。いままでは GTK を使うのはメインのプロセスだけで、他のスレッドでは GTK には絶対手を触れないようにしてた (つもりだったが、一カ所チョンボをしているところがあり、そこでたまに死んでた… ) のだ。
で、GTK で thread を使うときは、gtk_init() の前に gdk_threads_init() しておき、他のスレッドから GTK を操作するときには gdk_threads_enter() で lock して、gdk_threads_leave() で unlock するんだそうだ。これで万全。
ここで、「GTK の操作」というのには、GTK と競合するおそれのある、Pango や何かを使う操作も含まれると考えたほうがよい。Freetype の内側あたりで競合が発生して crash する場合には、gdk_threads_{enter,leave}() を使って解決できる。
でも、Win32 backend では、これは効かない。効かないだけでなく、呼んではいけない (!) ようだ。

コメントを残す