MOH*_*MED 3 c pthreads kill sigkill
我有以下代码.构建应用程序是myprogram.
如果我启动myprogram然后killall myprogram,然后我立即启动myprogram,然后myprogram崩溃.
崩溃原因是由于第一次启动创建的管理线程在第二次启动之前未正确清除.
所以在第二次启动时,myprogram试图用pthread创建线程,旧的线程管理还没有被删除,所以它会导致崩溃.
有没有办法在我第一次启动时或在我第二次使用C启动时开始杀死管理线程?
#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
}
Run Code Online (Sandbox Code Playgroud)
BTW:
linux使用libuClibc-0.9.30.1.so并根据这个问题如何在取消线程后杀死用pthread_create创建的所有子进程? 这个libc使用linux线程实现pthread并且不使用libc和NPTL("Native posix线程库")实现,所以管理线程只会为这个libc创建.
我想你,因为你杀有这个问题线程管理器通过killall根据本地POSIX线程库为Linux
,从Redhat纸:
如果管理器线程被杀死,则进程的其余部分处于必须手动清理的状态.
还有Linux线程模型比较:
一个致命的信号能够杀死所有线程.这方面的LinuxThreads设计一致.一旦进程收到致命信号,线程管理器就会用相同的信号杀死所有其他线程(进程).
这意味着如果你杀死线程管理器,它将没有机会杀死其他线程,所以你应该只使用kill -p pid不杀死主进程killall
我认为如果主进程正常存在,或者收到一个信号,线程管理器最终会在杀死并等待其他线程时终止,但是,它还提到如果你调用pthread_exit所有其他进程将在返回之前被杀死主要:
如果主进程调用pthread_exit(),则进程不会终止.主线程进入休眠状态,当所有其他线程被杀死时,管理器线程的工作是唤醒主线程.