C pthread 多執行緒

2021-10-07 06:15:40 字數 4986 閱讀 3431

本篇是我在學習c++多執行緒的時候做的筆記,主要記錄的是基礎的流程,部分**例項,以及重點函式的說明。

void * func1(void * t)
void* 表示無型別指標

void*作為函式引數,表示函式接收乙個指標,不管是什麼型別的指標都可以,但是傳遞之前要強制轉換為無型別指標。

基礎流程

pthread_t t1;//宣告乙個執行緒

pthread_create(&t1, null, &test, (void *)this);//建立乙個執行緒

pthread_exit(null);//退出執行緒

pthread_create() 函式原型

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

含有四個引數,

第乙個引數表示執行緒id

第二個引數表示執行緒引數

第三個是執行緒的入口函式名字

第四個引數表示執行緒入口函式的引數名字

pthread_exit();

函式原型

void  pthread_exit(void  *retval)

如果執行緒是joinable,可以在函式引數裡面傳遞執行緒的退出資訊給主線程

例如

#include

#include

using namespace std;

void *thread1(void *);

int status;

int main(void)

void *thread1(void *junk)

可以列印出

status_m addr is 0x7ffe3cfd6170

status addr is 0x6021b4

status_m value is 0x6021b4

the value is 23333

執行緒的joinable和detached屬性

屬性的設定方法如下

pthread_attr_t attr;//宣告乙個引數

pthread_attr_init(&attr);//對引數進行初始化

pthread_attr_setdetachstate(&attr, pthread_create_joinable);//設定執行緒為可連線的

pthread_attr_setdetachstate(&attr, pthread_create_detached);//設定執行緒為可分離的

pthread_attr_destroy(&attr)//銷毀屬性,防止記憶體洩漏

pthread_detach()

函式原型

int pthread_detach(pthread_t tid);

detached的執行緒在結束的時候會自動釋放執行緒所占用的資源

pthread_join()

函式原型

int pthread_join(pthread_t tid, void **status);

joinable的執行緒必須用pthread_join()函式來釋放執行緒所占用的資源,如果沒有執行這個函式,那麼執行緒的資源永遠得不到釋放。

互斥鎖 mutex

互斥鎖是為了多個執行緒在執行過程中保持資料同步引入的機制。

基本流程

pthread_mutex_t mutex = pthread_mutex_initializer;/*初始化互斥鎖*/

pthread_mutex_init(&mutex,null);/*動態初始化互斥鎖*/

pthread_mutex_lock(&mutex);//加鎖

pthread_mutex_unlock(&mutex);//解鎖

pthread_mutex_destroy(&mutex);//銷毀互斥鎖

舉個例子

#include

#include

#include

pthread_mutex_t mutex ;

void *print_msg(void *arg)

pthread_mutex_unlock(&mutex);

}int main(int argc,char** ar**)

條件變數

基本流程

pthread_mutex_t mutex = pthread_mutex_initializer;/*初始化互斥鎖*/

pthread_cond_t cond = pthread_cond_initializer;/*初始化條件變數*/

pthread_mutex_lock(&mutex);/*鎖住互斥量*/

pthread_cond_signal(&cond);//傳送訊號量 跟wait函式不在同乙個執行緒中

pthread_cond_wait(&cond,&mutex);//阻塞執行緒,等待條件變數,同時解鎖互斥量

pthread_mutex_unlock(&mutex);//解鎖互斥量

pthread_mutex_destroy(&mutex);//銷毀互斥鎖

pthread_cond_destroy(&cond);//銷毀條件變數

舉個例子

#include

#include

#include

#include

pthread_mutex_t mutex = pthread_mutex_initializer;/*初始化互斥鎖*/

pthread_cond_t cond = pthread_cond_initializer;/*初始化條件變數*/

void *thread1(void *);

void *thread2(void *);

int i=1;

int main(void)

void *thread1(void *junk)

pthread_mutex_unlock(&mutex);/*解鎖互斥量*/

printf("thread1: unlock %d\n", __line__);

printf("%s will sleep 1s in line: %d \n\n", __function__, __line__);

sleep(1);}}

void *thread2(void *junk)

pthread_mutex_unlock(&mutex);

printf("thread2: unlock %d\n", __line__);

printf("%s will sleep 1s in line: %d \n\n", __function__, __line__);

sleep(1);}}

結果為:

thread1: line: 29, i = 1

thread1: lock 31

thread1: unlock 41

thread1 will sleep 1s in line: 42

thread2: line: 52, i = 1

thread2: lock 54

thread2: wait 1 57

thread1: line: 29, i = 2

thread1: lock 31

thread1: unlock 41

thread1 will sleep 1s in line: 42

thread1: line: 29, i = 3

thread1: lock 31

thread1:signal 1 34

thread1:signal 2 36

thread1 will sleep 1s in line: 37

thread1: unlock 41

thread1 will sleep 1s in line: 42

thread2: wait 2 59

thread2: unlock 62

thread2 will sleep 1s in line: 63

thread1: line: 29, i = 4

thread1: lock 31

thread1: unlock 41

thread1 will sleep 1s in line: 42

thread2: line: 52, i = 4

thread2: lock 54

thread2: wait 1 57

thread1: line: 29, i = 5

thread1: lock 31

thread1: unlock 41

thread1 will sleep 1s in line: 42

thread1: line: 29, i = 6

thread1: lock 31

thread1:signal 1 34

thread1:signal 2 36

thread1 will sleep 1s in line: 37

thread1: unlock 41

thread2: wait 2 59

thread2: unlock 62

thread2 will sleep 1s in line: 63

thread1 will sleep 1s in line: 42

多執行緒 多執行緒原理

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...

多執行緒(一) tomcat 多執行緒

web server允許的最大執行緒連線數還受制於作業系統的核心引數設定,通常windows是2000個左右,linux是1000個左右。1.編輯tomcat安裝目錄下的conf目錄下的server.xml檔案 maxthreads 150 表示最多同時處理150個連線,tomcat使用執行緒來處理...

多執行緒 理解多執行緒(一)

程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...