POSIX 執行緒清理函式

2021-09-08 13:34:50 字數 2339 閱讀 9402

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 #include 

void 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 執行緒排程語義是按照一種概念模型定義的,在此概念模型中有乙個有效優先順序範圍,並且有一組執行緒列表,...