第一次使用pthread,遇到的問題還真不少,現在我一一記錄一下:
1.關於編譯時出現 對『pthread_create』未定義的引用 之類的錯誤的解決:由於pthread庫不是linux系統預設的庫,連線時需要使用庫libpthread.a,所以在使用pthread_create建立執行緒時,在編譯中要加-lpthread引數:
gcc -o pthread -lpthread pthread.c
特別的,如果這樣還沒解決的話:
按照上面編譯了一下,還是一樣的提示.
後面man gcc
才知道usage: gcc [options] file...
因此需要將庫鏈結放在末尾。
xs@vm:~/desktop$ gcc -o pthread pthread.c -lpthread
2.關於pthread裡的一些函式.
pthread_join函式:
函式pthread_join用來等待乙個執行緒的結束。
函式定義:int pthread_join(pthread_t thread, void **retval);
描述 :
pthread_join()函式,以阻塞的方式等待thread指定的執行緒結束。當函式返回時,被等待執行緒的資源被收回。如果程序已經結束,那麼該函式會立即返回。並且thread指定的執行緒必須是joinable的。
引數 :
thread: 執行緒識別符號,即執行緒id,標識唯一執行緒。
retval: 使用者定義的指標,用來儲存被等待執行緒的返回值。
返回值 : 0代表成功。 失敗,返回的則是錯誤號。
看下面一段程式:
#include #include #include void *thread(void *str)
return null;
}int main()
return 0;
}
如果我們注釋掉"pthread_join(pth, null);"這一行:
執行結果如下:
也就是說:子執行緒還沒有執行完畢,main函式已經退出,那麼子執行緒也就退出了!
如果我們不注釋掉那一行,那麼執行結果如下:
這說明:pthread_join函式的呼叫者在等待子執行緒退出後才繼續執行!
pthread_create函式:
宣告:
int pthread_create(pthread_t *thread,
const pthread_attr_t *restrict_attr,
void*(*start_rtn)(void*),
void *restrict arg);
引數:
第乙個引數*thread為指向執行緒識別符號的指標。
第二個引數*restrict_attr用來設定執行緒屬性,上面也可以用null,表示使用預設的屬性。
第三個引數是執行緒執行函式的起始位址。
最後乙個引數是執行函式的引數,null表示無引數。
另外,在編譯時注意加上-lpthread引數,以呼叫鏈結庫。因為pthread並非linux系統的預設庫,而是posix執行緒庫,在linux中將其作為乙個庫來使用,因此加上 -lpthread(或-pthread)以顯示的鏈結該庫。函式在執行錯誤時的錯誤資訊將作為返回值返回,並不修改系統全域性變數errno,當然也無法使用perror()列印錯誤資訊。
pthread_t:pthread_t用於宣告執行緒id!
型別定義:
typedef unsigned long int pthread_t;
//come from /usr/include/bits/pthread.h
sizeof (pthread_t) =4;
pthread_attr_init函式:
宣告:int pthread_attr_init(pthread_attr_t*attr);
返回值:返回0,表示函式初始化物件成功。失敗時返回乙個錯誤**。
引數:指向乙個執行緒屬性的指標。
下面乙個程式是書上的:
/*小小的乙個程式,折騰人個半死*/
#include #include #include int sum;
void *runner (void *param);
int main(int argc, char *argv)
if (atoi(argv[1] ) < 0)
pthread_attr_init(&attr); /*初始化,得到預設的屬性值*/
pthread_create(&tid, &attr, runner, argv[1]);/*建立乙個執行緒*/
pthread_join(tid, null);/*等待子執行緒執行完畢*/
printf ("sum = %d\n", sum);
return 0;
}void *runner(void *param)/*子執行緒將會執行這個函式*/
pthread_exit(0);
}
關於pthread裡面一些函式的使用心得!
第一次使用pthread,遇到的問題還真不少,現在我一一記錄一下 1.關於編譯時出現 對 pthread create 未定義的引用 之類的錯誤的解決 由於pthread庫不是linux系統預設的庫,連線時需要使用庫libpthread.a,所以在使用pthread create建立執行緒時,在編譯...
pthread一些函式的總結使用
第一次使用pthread,遇到的問題還真不少,現在我一一記錄一下 1.關於編譯時出現 對 pthread create 未定義的引用 之類的錯誤的解決 由於pthread庫不是linux系統預設的庫,連線時需要使用庫libpthread.a,所以在使用pthread create建立執行緒時,在編譯...
C 裡面關於虛函式的一些注意點
最後,總結一下關於虛函式的一些常見問題 1 虛函式是動態繫結的,也就是說,使用虛函式的指標和引用能夠正確找到實際類的對應函式,而不是執行定義類的函式。這是虛函式的基本功能,就不再解釋了。2 建構函式不能是虛函式。而且,在建構函式中呼叫虛函式,實際執行的是父類的對應函式,因為自己還沒有構造好,多型是被...