今天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...