1

メイン スレッドから呼び出される別のスレッドとして実行される Teamcenter ITK プログラムを作成しようとしています。メイン スレッドは、UI 上のアクションから呼び出されます。子スレッドは完了するまでに長い時間がかかるため、子スレッドを作成せずにコードをメイン スレッドに配置すると、UI が最大 10 分間フリーズします。これは許容できません。

SSO を使用しているため、メイン スレッドと子スレッドの両方で、メイン スレッドによって行われた認証を共有する必要があります。また、データベースに接続する必要があります。最後に、メイン スレッドは子スレッドが完了するのを待つべきではありません。

子スレッドを呼び出すコードは次のとおりです。

handle = (HANDLE) _beginthread (submitToPublishTibcoWf, 0, &input); // create thread
do
{
    sprintf(message, "Waiting %d time for 1000 milliseconds since threadReady is %d\n", i++, threadReady);
    log_msg(message);
    WaitForSingleObject(handle, 1000);
}
while (!threadReady);

sprintf(message, "Wait for thread to be ready over after %d tries since threadReady is %d\n", i, threadReady);
log_msg(message);
log_msg("Main thread about to exit now");

threadReady = 1実行に 8 分かかるコードを子スレッドで実行しようとするときはいつでも、グローバル変数を設定します。

問題は、メイン スレッドが終了した後に子スレッドが奇妙な動作をすることであり、次のエラーが発生します。

Fri May 25 11:34:46 2012 : Main thread about to exit now
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

ほとんどの子スレッドは実行されますが、最後にクラッシュすることがあります。

4

1 に答える 1

1

子スレッドの終了を防ぐために、デタッチを使用して子プロセスを独立させ、親に参加しないようにすることができます。したがって、子プロセスに参加しないでください。その後、メインスレッドから切り離す必要があります。

pthread_create(th, attr, what);
pthread_detach(th);
// and never join

また:

  1. アプリケーションに効率を追加したい場合は、 のような信号の特別なイベントを観察するために徹底的なリスニングを使用しないことをお勧めしますthreadReady。代わりに、pthreadまたは のような別のシグナリング メソッドで条件変数を使用しますgObject
  2. スレッド間で共有されるデータがあり、相互排除の問題に直面する可能性があり、マルチプロセッシングまたはマルチスレッドアプリケーションでこれらのような他の問題が発生する可能性があります。代わりに、条件のミューテックスやセマフォなどのメカニズムを使用して、これを手動で処理してみてください変数。
于 2012-05-26T05:34:21.163 に答える