2012-11-09 95 views
3

我有以下代码。构建应用程序是myprogram。如何用C杀死管理线程?

如果我启动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 

} 

BTW:

linux的使用libuClibc-0.9.30.1.so并根据这个问题How to kill all subprocess created with pthread_create after cancelling a thread?这个libc中使用Linux的线程执行的pthread,不与NPTL( “本地POSIX线程库”)实施 使用的libc所以管理线程将只为这种libc的情况创建。

回答

5

我想你,因为你是根据来自红帽The Native POSIX Thread Library for Linux 纸使用killall查杀线程管理器有这个问题:

如果管理线程就会被杀死的过程的其余部分是在 状态必须手动清理。

而且还Linux threading models compared

一个致命的信号可以杀死所有的线程。这一方面的LinuxThreads设计一直保持一致。 一旦进程收到一个致命信号,线程管理器将使用相同的信号杀死所有其他线程 (进程)。

这意味着,如果你杀线程管理器,它不会有机会杀死其他线程,所以你应该只使用kill -p pid杀主进程不killall

我想,如果主进程正常存在或接收到信号时,线程管理器最终会在杀死并等待其他线程时被杀死,但是,它还提到如果您调用pthread_exit,所有其他进程在返回主之前将被终止:

如果主进程调用pthread_exit(),进程不是 终止。主线程进入休眠状态,当所有其他线程都被终止时,管理线程的作用是唤醒主线程。

+0

有没有办法用C来杀死管理线程?在我的节目结束时。 – MOHAMED

+0

@MohamedKALLEL检查更新。 – iabdalkader

+0

当我的程序从外部命令收到'killall'或'kill -p'时,有没有办法执行'pthread_exit()'? – MOHAMED