- 帖子
- 48
- 主題
- 8
- 精華
- 0
- 可用積分
- 72
- 專(zhuān)家積分
- 0
- 在線(xiàn)時(shí)間
- 101 小時(shí)
- 注冊時(shí)間
- 2009-11-10
- 最 后登錄
- 2010-10-09
狀態(tài):...當前離線(xiàn)... [微博] [博客] [短信] | [倒序看帖] 1樓 發(fā)表于 2009-11-13 11:59 | 只看該作者 關(guān)于 pthread_cleanup_push 有如下描述: ================================ 從pthread_cleanup_push()的調用點(diǎn)到pthread_cleanup_pop()之間的程序段中的終止動(dòng)作 (包括調用pthread_exit()和取消點(diǎn)終止)都將執行pthread_cleanup_push()所指定的清理函數。 ================================ 請問(wèn)其中的“取消點(diǎn)終止”是什么意思? 我嘗試了以下的 pthread_cancel(),但并不會(huì )觸發(fā) clean(),這是為什么? 以下是代碼: #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> void clean(void* p) { printf("clean()\n"); } void* thread(void* p) { pthread_cleanup_push(clean, NULL); //=============================== printf("thread sleep\n"); sleep(10); printf("thread wake...\n"); //=============================== pthread_cleanup_pop(1); } int main() { pthread_t id; pthread_create(&id, NULL, thread, NULL); printf("main sleep\n"); sleep(3); printf("cancel thread: %u\n", id); pthread_cancel(id); return 0; } ========================== 輸出: thread sleep main sleep cancel thread: 3085872016 ========================== 在 xxx_push() 和 xxx_pop() 之間唯有調用 pthread_exit() 會(huì )觸發(fā) clean() 函數, return 也不會(huì ),(異常沒(méi)有試過(guò), 還不會(huì )手動(dòng)拋出異常); 這是一個(gè)老問(wèn)題了,也看到別人問(wèn)過(guò)(比如: http://bbs.chinaunix.net/viewthread.php?tid=456153) 但在網(wǎng)上一直沒(méi)有找到正式的回答; | |