Armadilloフォーラム

GTKを使ったThread処理で、xcb_lock.cエラー

ishikawa

2014年7月31日 10時52分

ミタニです。
いつもお世話になってます。

現在、GTKを使用して液晶に画像表示させるプログラムを作成しています。
その中で一部の処理を「pthread_create」でThread化させてから、下記エラーが出るようになりました。

../../src/xcb_lock.c:77: _XGetXCBBuffer: Assertion `((int) ((xcb_req) - (dpy->request)) >= 0)' failed.

Thread化する前はエラーが出てないため、Thread起因ではないかと考えています。
色々調べているのですが、原因は分かっていません。

このエラーの意味、原因、対策などについて、ご存知の方がいましたら教えていただけないでしょうか。

以上、よろしくお願いいたします。

コメント

at_takashi.sasayama

2014年8月7日 13時19分

笹山です。

> Thread化する前はエラーが出てないため、Thread起因ではないかと考えています。
> 色々調べているのですが、原因は分かっていません。

Guile-Gdk : 24 Threads
https://www.gnu.org/software/guile-gnome/docs/gdk/html/Threads.html
によると、GTK+ はスレッドセーフではない為、スレッドを使用する場合は
gdk-threads-enter / gdk-threads-leave 等を用いるようです。

Guile-Gdk : 24 Threads より転載

GTK+ is "thread aware" but not thread safe — it provides a global lock controlled by gdk-threads-enter/gdk-threads-leave which protects all use of GTK+. That is, only one thread can use GTK+ at any given time.

GTK+でのスレッドの使用方法は、下記ページのサンプルコードが参考になるかもしれません。

Multi threaded GTK+ applications
http://blog.borovsak.si/2009/06/multi-threaded-gtk-applications.html

ishikawa

2014年8月7日 16時57分

ミタニです。

サンプルコードまでご連絡いただき、ありがとうございます。
参考にして対応したいと思います。

> 笹山です。
>
> > Thread化する前はエラーが出てないため、Thread起因ではないかと考えています。
> > 色々調べているのですが、原因は分かっていません。
>
> Guile-Gdk : 24 Threads
> https://www.gnu.org/software/guile-gnome/docs/gdk/html/Threads.html
> によると、GTK+ はスレッドセーフではない為、スレッドを使用する場合は
> gdk-threads-enter / gdk-threads-leave 等を用いるようです。
>
> Guile-Gdk : 24 Threads より転載
>
> GTK+ is "thread aware" but not thread safe — it provides a global lock controlled by gdk-threads-enter/gdk-threads-leave which protects all use of GTK+. That is, only one thread can use GTK+ at any given time.
>
>
> GTK+でのスレッドの使用方法は、下記ページのサンプルコードが参考になるかもしれません。
>
> Multi threaded GTK+ applications
> http://blog.borovsak.si/2009/06/multi-threaded-gtk-applications.html

at_hanada

2014年8月7日 14時13分

花田です。

一般的にスレッド間の競合を防ぐには、同期機構を使って排他処理をするか、
操作そのものは単一のスレッドからのみ行うか、どちらかの手段を取ります。
GTKの場合、前者ではgtk_threads_init/enter/leaveを使用する方法があり、
後者ではスレッド間で処理を指示するためg_idle_add_fullが利用できます。

そのまま解説してくれたblog記事を見つけました。参考になると思います。

GtkWidgetブラウザコンポーネント比較その3( マルチスレッド環境のGTK+制御)
http://d.hatena.ne.jp/irasya/comment?date=20100601

ishikawa

2014年8月7日 16時58分

ミタニです。

ご連絡いただき、ありがとうございます。
blog記事を参考に、対応してみたいと思います。

> 花田です。
>
> 一般的にスレッド間の競合を防ぐには、同期機構を使って排他処理をするか、
> 操作そのものは単一のスレッドからのみ行うか、どちらかの手段を取ります。
> GTKの場合、前者ではgtk_threads_init/enter/leaveを使用する方法があり、
> 後者ではスレッド間で処理を指示するためg_idle_add_fullが利用できます。
>
> そのまま解説してくれたblog記事を見つけました。参考になると思います。
>
> GtkWidgetブラウザコンポーネント比較その3( マルチスレッド環境のGTK+制御)
> http://d.hatena.ne.jp/irasya/comment?date=20100601
>