關於apue中pthread exit 函式的使用

2021-09-22 08:22:00 字數 1680 閱讀 5079

今天apue 的執行緒章節學習執行緒退出時,書上對pthread_exit()和pthread_join 函式的說明不是很詳細,看了乙個例子還是不理解,說的太過官方

那麼先介紹一下

pthread_join(pthread_join thread, void **rval_ptr)
thread = 執行緒id , rval_ptr = pthread_exit()的引數,也就是說pthread_exit() 函式的引數是這個執行緒的返回值,當執行緒結束後join 函式可以獲取他的返回值

pthread_exit(void *rval_ptr)
執行緒裡邊不能使用exit _exit _exit 函式退出,這樣會導致程序退出,所以一般使用pthread_exit 函式或者直接return的方式進行退出 那麼這個函式的引數是幹啥的

rval_ptr 就相當於返回值 join 可以接受到

使用例子書上都談一下書上說的乙個陷阱,需要注意的地方

#include "apue.h"

#include struct foo ;

void printfoo(const char *s , const struct foo *fp)

void * thr_fn1(void *arg);

printfoo("thread 1:\n", &foo);

pthread_exit((void *)&foo);

}void * thr_fn2(void *arg)

int main(void)

err = pthread_join(tid1, (void *)&fp);

if (err != 0)

sleep(1);

printf("parent starting second thread \n");

err = pthread_create(&tid2, null, thr_fn2, null);

if (err != 0)

sleep(1);

printfoo("parent :\n", fp);

exit(0);

}

在mac 上編譯執行後出現如下錯誤:

thread 1:

, struct at 0x7000012d1ed0

foo.a = 1

foo.b = 2

foo.c = 3

foo.d = 4

parent starting second thread

thread 2: id is 123145322045440

parent :

, struct at 0x7000012d1ed0

[1] 3990 segmentation fault ./a.out

其實在理解了pthread_exit() 和 pthread_join() 的引數關係後,就很容易看出來問題了

thr_fn1 中的 struct foo foo = ; 是在棧中申請的記憶體,當執行緒退出時也就銷毀了,等到main 函式訪問join 獲取到的返回值 就會出現段記憶體錯誤

解決辦法是將foo 作為全域性變數

關於path alloc 函式(APUE)

鏈結為 在apue的某些版本中,在例子4 7和4 9中用到的函式path alloc 函式,許多人直接把例題輸入後發現並不能編譯,這是由於path alloc 函式的原因,因此,我們需要將這個函式補齊。我從網上查了一下,其中有好多的答案是從apue的老版本中的解決方法,如下 figure 2.15....

關於path alloc函式(APUE)

include apue.h include include ifdef path max static int pathmax path max else static int pathmax 0 endif define susv3 200112l static long posix versi...

關於path alloc函式(APUE)

在apue的某些版本中,在例子4 7和4 9中用到的函式path alloc 函式,許多人直接把例題輸入後發現並不能編譯,這是由於path alloc 函式的原因,因此,我們需要將這個函式補齊。我從網上查了一下,其中有好多的答案是從apue的老版本中的解決方法,如下 figure 2.15.dyna...