Linux開發_多線程編程

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);    //阻塞方式
   
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章