1

GSocketService をデフォルト以外 (NULL) のメイン ループ コンテキストにアタッチする方法はありますか? A は API を検索しましたが、GSocketService の「アタッチ」機能を見つけることができませんでした。GSocketService に含まれる下位レベルの構造体にそのような関数があるのか​​もしれませんが、デフォルト以外のメイン ループ コンテキストで実行しているときに「着信」シグナルを送信するとどうなるかはわかりません。

4

1 に答える 1

0

GSocketServiceDocbook エントリから:

ソケット サービスは、それが作成されたスレッドのスレッド デフォルト コンテキストのメイン ループで実行され、一般にスレッドセーフではありません。ただし、サービスを開始および停止するための呼び出しはスレッドセーフであるため、着信クライアントを処理するスレッドから使​​用できます。

スレッドのデフォルト コンテキストを変更するには、次を使用しますg_main_context_push_thread_default/pop_thread_default

g_main_context_push_thread_default ()

void g_main_context_push_thread_default (GMainContext *context); コンテキストを取得し、それを現在のスレッドのスレッドの既定のコンテキストとして設定します。これにより、このスレッドで開始された特定の非同期操作 (ほとんどの gio ベースの I/O など) が、メイン スレッドのグローバル デフォルト コンテキストで実行されるのではなく、コンテキストで実行され、その結果がメイン ループに配信されます。この関数を呼び出すと、g_main_context_default() によって返されるコンテキストではなく、g_main_context_get_thread_default() によって返されるコンテキストが変更されることに注意してください。したがって、g_idle_add() などの関数によって使用されるコンテキストには影響しません。

通常、新しいスレッドを作成した直後にこの関数を呼び出し、そのスレッドの GMainLoop によって実行される GMainContext を渡して、そのスレッドのすべての非同期操作の新しいデフォルト コンテキストを設定します。(この場合、g_main_context_pop_thread_default() を呼び出す必要はありません。)ただし、場合によっては、デフォルト以外のコンテキストで単一の操作をスケジュールしたり、メインスレッドでデフォルト以外のコンテキストを一時的に使用したりすることが必要になる場合があります。 . その場合、非同期操作への呼び出しを g_main_context_push_thread_default() / g_main_context_pop_thread_default() ペア内にラップできますが、デフォルト以外のコンテキストがアクティブな間に他の非同期操作が誤って開始されないようにするのはあなた次第です。

この関数より前のライブラリは、スレッドのデフォルト コンテキストを持つスレッドからの使用を正しく処理しない可能性があることに注意してください。たとえば、g_file_supports_thread_contexts() を参照してください。

環境 :

GMainContext、またはグローバルなデフォルト コンテキストの場合は NULL。[allow-none] 2.22以降

于 2013-12-04T19:03:52.243 に答える