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起因ではないかと考えています。
色々調べているのですが、原因は分かっていません。
このエラーの意味、原因、対策などについて、ご存知の方がいましたら教えていただけないでしょうか。
以上、よろしくお願いいたします。
コメント
ishikawa
ミタニです。
サンプルコードまでご連絡いただき、ありがとうございます。
参考にして対応したいと思います。
> 笹山です。
>
> > 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
花田です。
一般的にスレッド間の競合を防ぐには、同期機構を使って排他処理をするか、
操作そのものは単一のスレッドからのみ行うか、どちらかの手段を取ります。
GTKの場合、前者ではgtk_threads_init/enter/leaveを使用する方法があり、
後者ではスレッド間で処理を指示するためg_idle_add_fullが利用できます。
そのまま解説してくれたblog記事を見つけました。参考になると思います。
GtkWidgetブラウザコンポーネント比較その3( マルチスレッド環境のGTK+制御)
http://d.hatena.ne.jp/irasya/comment?date=20100601
ishikawa
ミタニです。
ご連絡いただき、ありがとうございます。
blog記事を参考に、対応してみたいと思います。
> 花田です。
>
> 一般的にスレッド間の競合を防ぐには、同期機構を使って排他処理をするか、
> 操作そのものは単一のスレッドからのみ行うか、どちらかの手段を取ります。
> GTKの場合、前者ではgtk_threads_init/enter/leaveを使用する方法があり、
> 後者ではスレッド間で処理を指示するためg_idle_add_fullが利用できます。
>
> そのまま解説してくれたblog記事を見つけました。参考になると思います。
>
> GtkWidgetブラウザコンポーネント比較その3( マルチスレッド環境のGTK+制御)
> http://d.hatena.ne.jp/irasya/comment?date=20100601
>
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