4

重複の可能性:
pthreadでスレッドを強制終了します

ここでは、スレッドの起動を含むソースコードの後、しばらくしてそれを強制終了したいと思います。どうやってするの ?スレッド機能を変更せずに

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

pthread_t test_thread;

void *thread_test_run (void *v) // I must not modify this function
{
    int i=1;
    while(1)
    {
       printf("into thread %d\r\n",i);
       i++; 
       sleep(1);
    }
    return NULL
}

int main()
{
    pthread_create(&test_thread, NULL, &thread_test_run, NULL);

    sleep (20);
    // Kill the thread here. How to do it?

   // other function are called here...

    return 0;
}
4

2 に答える 2

12

pthread_cancel()を使用して、スレッドを強制終了できます。

int pthread_cancel(pthread_t thread);

スレッドは、ロックの解放やメモリの解放など、必要なクリーンアップを実行する機会がない可能性があることに注意してください。したがって、最初pthread_cleanup_push()に、スレッドがキャンセルされたときに呼び出されるクリーンアップ関数を追加するために使用する必要があります。男からpthread_cleanup_push(3)

これらの関数は、呼び出し元のスレッドのスレッドキャンセルクリーンアップハンドラーのスタックを操作します。 クリーンアップハンドラーは、スレッドがキャンセルされたとき(または以下で説明するその他のさまざまな状況)に自動的に実行される関数です。たとえば、ミューテックスのロックを解除して、プロセス内の他のスレッドで使用できるようにすることができます。

スレッドがブロックされた場合にキャンセルされるかどうかの質問に関しては、それは保証されていません。マニュアルにもこれが記載されていることに注意してください。

pthread_setcanceltype(3)によって決定されるスレッドのキャンセルタイプは、非同期または遅延(新しいスレッドのデフォルト)のいずれかです。非同期キャンセル可能性とは、スレッドをいつでもキャンセルできることを意味します(通常はすぐにキャンセルできますが、システムはこれを保証しません)。キャンセル可能性の延期とは、スレッドが次にキャンセルポイントである関数を呼び出すまでキャンセルが遅延することを意味します。

したがって、これは、唯一の保証された動作が、への呼び出し後の特定の時点でスレッドがキャンセルされることを意味しpthread_cancel()ます。

:スレッドコードを変更してクリーンアップハンドラーを追加できない場合は、pthread_kill()を使用してスレッドを強制終了する以外に方法はありませんが、前述の理由から、これは非常に悪い方法です。

于 2012-11-08T08:45:53.557 に答える
4

簡単な答えはこれです:スレッドが実行しているコードの協力により、サポートされている任意のメソッドを使用してスレッドを終了できます。スレッドが実行しているコードの協力がなければ、試してはいけません。スレッドを強制終了したときにスレッドがクリティカルロックを保持している場合はどうなりますか?スレッドにメモリが割り当てられていて、そのメモリを解放するコードが他にない場合はどうなりますか?

于 2012-11-08T09:15:53.547 に答える