- 论坛徽章:
- 5
|
有一个程序,需要接受可以用signal 15信号就可以退出,因为用signal 9程序是接收不到信号会直接退出的,然后在这个程序调用的过程中有一个函数会调用底层的共享内存,从而导致很小几率的core dump。
程序当中线程安排情况:
主线程1个,其他线程9个,其中,主线程和其他8个线程工作在一个第三方库的循环里面,只有一个线程(叫线程D吧)是自己创建的,那个线程D会调用底层的共享内存,其他的线程不会。
我的设计是这样的
在线程D里面:
run()
{
sigaction(SIGTERM, &sigterm_action, NULL);//当signal 15发过来的时候,sigterm_action将会被调用,他的作用是发送pthread_cancel(pthread_self());
pthread_cleanup_push(cleanup_handler, this);//当接受到pthread_cancel的信号之后,cleanup_handler会调用,这个里面会给所有的其他线程发送pthread_cancel然后自己退出。
while(1)
{
pthread_testcancel();
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
会调用共享内存的函数
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
}
pthread_cleanup_pop(0);
}
主线程里
pthread_cleanup_push(cleanup_handler, NULL);//主线程接受到从子线程传来的pthread_cancel之后,先调用pthread_join等待其他线程退出,然后自己再清除一下自己的残余资源也退出。
第三方的线程调用的函数,一调用主线程一直停在这里
pthread_cleanup_pop(0);
我的问题是,这样的设计会有缺陷吗?安全吗? |
|