国产精品免费嫩草研究院|无遮羞动漫在线观看AV|国产麻豆精品传媒AV国产在线|村在线观看|寂寞情人1正版|韩国床震韩国床震古|精品系列专区久久

一 Pthread 并發編程——深入剖析線程基本元素和狀態

Pthread 并發編程(一)——深入剖析線程基本元素和狀態前言在本篇文章當中講主要給大家介紹 pthread 并發編程當中關于線程的基礎概念,并且深入剖析進程的相關屬性和設置,以及線程在內存當中的布局形式,幫助大家深刻理解線程 。
深入理解 pthread_create基礎例子介紹在深入解析 pthread_create 之前,我們先用一個簡單的例子簡單的認識一下 pthread,我們使用 pthread 創建一個線程并且打印 Hello world 字符串 。
#include <stdio.h>#include <pthread.h>void* func(void* arg) {printf("Hello World from tid = %ld\n", pthread_self()); // pthread_self 返回當前調用這個函數的線程的線程 idreturn NULL;}int main() {pthread_t t; // 定義一個線程pthread_create(&t, NULL, func, NULL); // 創建線程并且執行函數 func// wait unit thread t finishedpthread_join(t, NULL); // 主線程等待線程 t 執行完成然后主線程才繼續往下執行printf("thread t has finished\n");return 0;}編譯上述程序:
clang helloworld.c -o helloworld.out -lpthread或者gcc helloworld.c -o helloworld.out -lpthread在上面的代碼當中主線程(可以認為是執行主函數的線程)首先定義一個線程,然后創建線程并且執行函數 func ,當創建完成之后,主線程使用 pthread_join 阻塞自己,直到等待線程 t 執行完成之后主線程才會繼續往下執行 。
我們現在仔細分析一下 pthread_create 的函數簽名,并且對他的參數進行詳細分析:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

  • 參數 thread 是一個類型為 pthread_t 的指針對象,將這個對象會在 pthread_create 內部會被賦值為存放線程 id 的地址,在后文當中我們將使用一個例子仔細的介紹這個參數的含義 。
  • 參數 attr 是一個類型為 pthread_attr_t 的指針對象,我們可以在這個對象當中設置線程的各種屬性,比如說線程取消的狀態和類別,線程使用的棧的大小以及棧的初始位置等等,在后文當中我們將詳細介紹這個屬性的使用方法,當這個屬性為 NULL 的時候,使用默認的屬性值 。
  • 參數 start_routine 是一個返回類型為 void* 參數類型為 void* 的函數指針,指向線程需要執行的函數,線程執行完成這個函數之后線程就會退出 。
  • 參數 arg ,傳遞給函數 start_routine 的一個參數,在上一條當中我們提到了 start_routine 有一個參數,是一個 void 類型的指針,這個參數也是一個 void 類型的指針,在后文當中我們使用一個例子說明這個參數的使用方法 。
深入理解參數 thread在下面的例子當中我們將使用 pthread_self 得到線程的 id ,并且通過保存線程 id 的地址的變量 t 得到線程的 id ,對兩個得到的結果進行比較 。
#include <stdio.h>#include <pthread.h>void* func(void* arg) {printf("線程自己打印線程\tid = %ld\n", pthread_self());return NULL;}int main() {pthread_t t;pthread_create(&t, NULL, func, NULL);printf("主線程打印線程 t 的線程 id = %ld\n", *(long*)(&t));pthread_join(t, NULL);return 0;}上面程序的執行結果如下圖所示:
一 Pthread 并發編程——深入剖析線程基本元素和狀態

文章插圖
根據上面程序打印的結果我們可以知道,變量 pthread_t t 保存的就是線程 id 的地址,參數 t 和線程 id 之間的關系如下所示:
一 Pthread 并發編程——深入剖析線程基本元素和狀態

文章插圖
在上面的代碼當中我們首先對 t 取地址,然后將其轉化為一個 long 類型的指針,然后解引用就可以得到對應地址的值了,也就是線程的ID 。
深入理解參數 arg在下面的程序當中我們定義了一個結構體用于保存一些字符出的信息,然后創建一個這個結構體的對象,將這個對象的指針作為參數傳遞給線程要執行的函數,并且在線程內部打印字符串當中的內容 。

經驗總結擴展閱讀