背景
開工前我就覺得有什么不太對勁,感覺要背鍋。這可不,上班第三天就捅鍋了。
我們有個了不起的后臺程序,可以動態加載模塊,并以線程方式運行,通過這種形式實現插件的功能。而模塊更新時候,后臺程序自身不會退出,只會將模塊對應的線程關閉、更新代碼再啟動,6 得不行。
于是乎我就寫了個模塊準備大展身手,結果忘記寫退出函數了,導致每次更新模塊都新創建一個線程,除非重啟那個程序,否則那些線程就一直茍活著。
這可不行啊,得想個辦法清理呀,要不然怕是要炸了。
那么怎么清理呢?我能想到的就是兩步走:
找出需要清理的線程號 tid; 銷毀它們;找出線程ID
和平時的故障排查相似,先通過 ps 命令看看目標進程的線程情況,因為已經是 setName 設置過線程名,所以正常來說應該是看到對應的線程的。 直接用下面代碼來模擬這個線程:
Python 版本的多線程
#coding: utf8import threadingimport osimport timedef tt(): info = threading.currentThread() while True: print 'pid: ', os.getpid() print info.name, info.ident time.sleep(3)t1 = threading.Thread(target=tt)t1.setName('OOOOOPPPPP')t1.setDaemon(True)t1.start()t2 = threading.Thread(target=tt)t2.setName('EEEEEEEEE')t2.setDaemon(True)t2.start()t1.join()t2.join()輸出:
root@10-46-33-56:~# python t.py
pid: 5613
OOOOOPPPPP 139693508122368
pid: 5613
EEEEEEEEE 139693497632512
...
可以看到在 Python 里面輸出的線程名就是我們設置的那樣,然而 Ps 的結果卻是令我懷疑人生:
root@10-46-33-56:~# ps -Tp 5613
PID SPID TTY TIME CMD
5613 5613 pts/2 00:00:00 python
5613 5614 pts/2 00:00:00 python
5613 5615 pts/2 00:00:00 python
正常來說不該是這樣呀,我有點迷了,難道我一直都是記錯了?用別的語言版本的多線程來測試下:
C 版本的多線程
#include<stdio.h>#include<sys/syscall.h>#include<sys/prctl.h>#include<pthread.h>void *test(void *name){ pid_t pid, tid; pid = getpid(); tid = syscall(__NR_gettid); char *tname = (char *)name; // 設置線程名字 prctl(PR_SET_NAME, tname); while(1) { printf("pid: %d, thread_id: %u, t_name: %s/n", pid, tid, tname); sleep(3); }}int main(){ pthread_t t1, t2; void *ret; pthread_create(&t1, NULL, test, (void *)"Love_test_1"); pthread_create(&t2, NULL, test, (void *)"Love_test_2"); pthread_join(t1, &ret); pthread_join(t2, &ret);}輸出:
root@10-46-33-56:~# gcc t.c -lpthread && ./a.out
pid: 5575, thread_id: 5577, t_name: Love_test_2
pid: 5575, thread_id: 5576, t_name: Love_test_1
新聞熱點
疑難解答