次のコードがあります。ビルド アプリケーションは myprogram です。
myprogram を起動してから myprogram をすべて kill し、その直後に myprogram を再度起動すると、myprogram がクラッシュします。
クラッシュの原因は、最初の起動で作成された管理スレッドが 2 回目の起動の前に適切にクリアされていないことにあります。
そのため、myprogram が pthread を使用してスレッドを作成しようとする 2 回目の起動時に、古いスレッド管理がまだ削除されていないため、クラッシュが発生します。
最初の起動の終わり、またはCでの 2 回目の起動の開始時に管理スレッドを強制終了する方法はありますか?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t test_thread;
void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}
int main()
{
// ps aux | grep myprogram ---> show 1 myprogram (1 for the main application)
pthread_create(&test_thread, NULL, &thread_test_run, NULL);
// ps aux | grep myprogram ---> show 3 myprogram
// (1st for the main application)
// (2nd for the management thread. thread which manage all created thread)
// (3rd for the created thread)
sleep (20);
pthread_cancel(test_thread);
// ps aux | grep myprogram ---> show 2 myprogram and
// (1st for the main application)
// (2nd for the management thread. thread which manage all created thread)
sleep(100);
// in this period (before the finish of myprogram)
// I execute killall to kill myprogram
// and then immediately I re-launch myprogram and then the program crash
// because the management thread is not immediately killed
}
ところで:
Linuxの使用libuClibc-0.9.30.1.so
とこの質問によると、スレッドをキャンセルした後、pthread_createで作成されたすべてのサブプロセスを強制終了する方法は? この libc は の Linux スレッド実装をpthread
使用し、NPTL (「ネイティブ posix スレッド ライブラリ」) 実装で libc を使用しないため、管理スレッドはこの libc の場合にのみ作成されます。