posix 多執行緒的 cleanup 函式
控制清理函式的函式有兩個,乙個是 pthread_cleanup_push(), 用來把清理函式壓入棧中,另乙個是 pthread_cleanup_pop(), 用來把棧中的函式彈出來。
下面是這兩個函式的函式原型:
#include void pthread_cleanup_push(void (*routine)(void *), void *arg);void pthread_cleanup_pop(int
execute);
//compile and link with -pthread.
我們先寫個簡單的例子,感性認識一下這兩個函式的作用:
#include #includevoid handlers(void *arg)
else
}void *thread_start(
void *arg)
intmain()
return0;
}
編譯並執行:
this is thread [3290769152]handlers() : [thr]
handlers() : [two]
handlers() : [one]
thread
return : [he~he~]
我們在**裡面是按照 one、two、thr 的順序呼叫的 pthread_cleanup_push() 函式, 結果在執行後得到的結果中,卻看到它們輸出的順序正好倒過來了。 這正是這對函式的性質。
並且這對函式還有乙個性質,那就是使用 pthread_cleanup_push() 和 pthread_cleanup_pop() 之間使用 return 的話,會導致之後的 pthread_cleanup_pop() 不起作用。 這是為什麼呢?原因是,其實 pthread_cleanup_push() 和 pthread_cleanup_pop() 不是函式, 而是一對巨集。
其巨集定義在標頭檔案 pthread.h 中可以看到,巨集定義如下:
# define pthread_cleanup_push(routine, arg) \dowhile (0)
我們寫個更簡單的程式,把這兩個巨集展開後看一看是什麼樣結果:
**如下:
# define pthread_cleanup_push(routine, arg) \dowhile (0)
編譯:
gcc -g -e -o pthread_cleanup_macro.i pthread_cleanup_macro.c
檢視 pthread_cleanup_macro.i 的**:
void hand(void*arg)void *thread_start(void*arg) __pthread_register_cancel (&__cancel_buf); do
while (0); } while (0); __pthread_unregister_cancel (&__cancel_buf); if (1) __cancel_routine (__cancel_arg); } while (0
);
return ((void *)0);}
intmain()
可以看到,thread_start 函式裡面的 pthread_cleanup_push() 和 pthread_cleanup_pop() 已經被展開了。我們把 thread_start 函式裡面的**再修飾一下格式,結果如下:
void *thread_start(void*arg)__pthread_register_cancel (&__cancel_buf);
do while (0
); }
while (0
); __pthread_unregister_cancel (&__cancel_buf);
if (1
) __cancel_routine (__cancel_arg);
} while (0
);
return ((void *)0
);}
可以看到,我們輸出執行緒資訊的 printf 語句,被一層層的 do{}while(0) 給包圍了。 如果在 pthread_cleanup_push() 和 pthread_cleanup_pop() 之間加乙個 return , 那麼整個 do{}while(0) 就會被跳出,後面的**肯定也就不會被執行了。
執行緒清理函式
下面是一篇關於該知識點的文字,覺得不錯,分享下 下面的測試程式我們都省略錯誤檢查 如同程序可以呼叫atexit函式安排在他退出時需要呼叫的函式一樣,程序也可以安排在他退出時呼叫的 函式。這些清理函式記錄在棧中,所以他們執行的順序和註冊的順序是相反的。incldue void pthread clea...
C語言POSIX執行緒常用函式
include 1.int pthread create pthread t thread,pthread attr t attr,void start routine void void arg 建立新執行緒 2.void pthread exit void retval 終止執行緒 3.int ...
posix 執行緒排程
thread 排程 posix 定義一種優先順序排程模型,此模型確定任何兩個執行緒相對於對方的重要程度。每當有乙個以上的執行緒可以執行 執行就緒 時,系統都將選擇具有最高優先順序的執行緒。posix 執行緒排程語義是按照一種概念模型定義的,在此概念模型中有乙個有效優先順序範圍,並且有一組執行緒列表,...