- 論壇徽章:
- 5
|
有一個(gè)程序,需要接受可以用signal 15信號就可以退出,因?yàn)橛胹ignal 9程序是接收不到信號會直接退出的,然后在這個(gè)程序調(diào)用的過程中有一個(gè)函數(shù)會調(diào)用底層的共享內(nèi)存,從而導(dǎo)致很小幾率的core dump。
程序當(dāng)中線程安排情況:
主線程1個(gè),其他線程9個(gè),其中,主線程和其他8個(gè)線程工作在一個(gè)第三方庫的循環(huán)里面,只有一個(gè)線程(叫線程D吧)是自己創(chuàng)建的,那個(gè)線程D會調(diào)用底層的共享內(nèi)存,其他的線程不會。
我的設(shè)計(jì)是這樣的
在線程D里面:
run()
{
sigaction(SIGTERM, &sigterm_action, NULL);//當(dāng)signal 15發(fā)過來的時(shí)候,sigterm_action將會被調(diào)用,他的作用是發(fā)送pthread_cancel(pthread_self());
pthread_cleanup_push(cleanup_handler, this);//當(dāng)接受到pthread_cancel的信號之后,cleanup_handler會調(diào)用,這個(gè)里面會給所有的其他線程發(fā)送pthread_cancel然后自己退出。
while(1)
{
pthread_testcancel();
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
會調(diào)用共享內(nèi)存的函數(shù)
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
}
pthread_cleanup_pop(0);
}
主線程里
pthread_cleanup_push(cleanup_handler, NULL);//主線程接受到從子線程傳來的pthread_cancel之后,先調(diào)用pthread_join等待其他線程退出,然后自己再清除一下自己的殘余資源也退出。
第三方的線程調(diào)用的函數(shù),一調(diào)用主線程一直停在這里
pthread_cleanup_pop(0);
我的問題是,這樣的設(shè)計(jì)會有缺陷嗎?安全嗎? |
|