Linux下的多線程使用的庫是pthread,是一個準守POSIX接口的函數庫。
Linux下多線程編程對函數定義原型有要求,必須是void *函數名(void *參數名),或者void 函數名(void);
主要創建函數是:
pthread_create
參數:
參數 | 描述 |
---|---|
thread | 指向線程標識符指針。 |
attr | 一個不透明的屬性對象,可以被用來設置線程屬性。您可以指定線程屬性對象,也可以使用默認值 NULL。 |
start_routine | 線程運行函數起始地址,一旦線程被創建就會執行。 |
arg | 運行函數的參數。它必須通過把引用作爲指針強制轉換爲 void 類型進行傳遞。如果沒有傳遞參數,則使用 NULL。 |
返回值
創建線程成功時,函數返回 0,若返回值不爲 0 則說明創建線程失敗。
終止線程函數:
pthread_exit
pthread_exit是隻能被線程調用,不能用來結束其它線程,如果被main函數調用,則會等待其它線程結束,纔會結束main函數
參數 | 描述 |
---|---|
retval | 當結束時,這個參數可以被pthread_join函數獲取 |
線程和進程的堆棧是共享的,即便線程調用這個函數結束了,本身所使用的資源是不會結束的,線程不像函數受函數調用保護,會自動清棧,而線程結束了,申請的變量,或者使用的資源都不會被釋放
回收函數:
pthread_join
此函數用來等待一個線程結束,並釋放此線程的所有資源,並把此線程調用pthread_exit時傳遞的參數獲取到
參數:
參數 | 描述 |
---|---|
thread | 指向線程標識符指針。 |
etval | 用戶定義的指針,用來存儲被等待線程的返回值。 |
第二個參數會獲取到,要回收線程使用pthread_exit的第一個參數對象
頭文件:
#include <pthread.h>
實戰
1.創建一個簡單的線程
#include <stdio.h>
#include <pthread.h>
// 線程的運行函數
void* say_hello(void* args)
{
printf("hello word");
return 0;
}
int main()
{
// 定義線程的 id 變量
pthread_t tids;
int ret = pthread_create(&tids, NULL, say_hello, NULL);
if (ret != 0)
{
printf("線程創建失敗");
}
}
//等待線程執行結束
pthread_exit(NULL);
}
編譯時要加“-lpthread ”
gcc test.c -lpthread
2. 回收線程
剛剛的demo,因爲執行完就會退出程序,所以不需要回收,但是如果線程結束,程序不會退出,就會造成資源浪費,所以改進demo,使用pthread_join回收一下
#include <stdio.h>
#include <pthread.h>
// 線程的運行函數
void* say_hello(void* args)
{
for(int i = 0;i<1000;++i){
printf("hello word");
}
}
int main()
{
// 定義線程的 id 變量
pthread_t tids;
int ret = pthread_create(&tids, NULL, say_hello, NULL);
if (ret != 0)
{
printf("線程創建失敗");
}
}
pthread_join(tids,NULL); //阻塞方式
}