2

タイマーを開始し、間隔を 5 秒に設定し、シグナル ハンドラを登録しました。SIGALRM が発生すると、シグナル ハンドラ内でスレッドを終了しようとしますが、bt ではそれができません。このプロセス全体が強制終了されるのではなく、スレッドが終了していません。
コードは次のとおりです。

 void signalHandler()
{
        printf("Caught signal ...\n");
        printf("Now going to terminate thread..\n");
        pthread_kill(tid, SIGKILL);
}

void * thread_function()
{
        int oldstate;
        char result[256] = {0};
        time_t startTime = time(NULL);
        time_t timerDuration = 5;
        time_t endTime = startTime + timerDuration;

        while(1) {
                printf("Timer is runnuing as dameon..\n");
                if(!strcmp(result, "CONNECTED")) {
                        resp = 1;
                        pthread_exit(&resp);
                }
        }
}

int main()
{
        int *ptr[2];

        signal(SIGALRM, signalHandler);

        timer.it_interval.tv_usec = 0;
        timer.it_interval. tv_usec = 0;

        timer.it_value.tv_sec = INTERVAL;
        timer.it_value.tv_usec = 0;

        setitimer(ITIMER_REAL, &timer, 0);
            pthread_create(&tid, NULL, thread_function, NULL);
        pthread_join(tid, (void**)&(ptr[0]));
        printf("test %d\n\n",*ptr[0]);

        while(1)
                printf("1");
}

プラットフォーム: Linux、gcc コンパイラ

4

3 に答える 3

2

私の知る限り、コードがどのような状態にあるかわからないため、シグナルハンドラー内で何も呼び出すことはできません。

最良のオプションは、シグナルを処理するスレッドを設定することです。他のすべてのスレッドは、を呼び出しpthread_setsigmaskてすべてのシグナルをブロックする必要があります。次に、別のスレッドを作成します。このスレッドは、呼び出しを呼び出しpthread_setsigmaskてキャッチSIGALARMし、次に呼び出しsigwaitます。この時点で、他のスレッドをキャンセルできます。

于 2012-07-20T07:19:44.827 に答える
1

シングルスレッド環境と比較して、マルチスレッド環境でシグナルを処理する方法は大きく異なります。マルチスレッド コードでは、ビジネス ロジックを持つすべてのスレッドのすべてのシグナルをブロックしてから、シグナルを処理するための別のスレッドを作成する必要があります。これは、マルチスレッド環境では、シグナルがどのスレッドに配信されるかを確認できないためです。

詳細については、次のリンクを参照してください:
http://devcry.heiho.net/2009/05/pthreads-and-unix-signals.html

これとは別に、スレッドを強制終了するにはpthread_cancelを使用します。これはうまく機能するはずです。

于 2012-07-20T08:58:07.697 に答える
0

フラグを使用して試すことができます:

int go_on[number_of_threads] = { 1 };

void signalHandler()
{
        printf("Caught signal ...\n");
        printf("Now going to terminate thread..\n");
        go_on[tid] = 0;
}

void * thread_function()
{  /* */
   while(go_on[this_thread_id]) {
                printf("Timer is runnuing as dameon..\n");
                if(!strcmp(result, "CONNECTED")) {
                        resp = 1;
                        pthread_exit(&resp);
                }
   }
}
于 2012-07-20T07:24:57.287 に答える