本篇是我在學習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執行緒的joinable和detached屬性status addr is 0x6021b4
status_m value is 0x6021b4
the value is 23333
屬性的設定方法如下
pthread_attr_t attr;//宣告乙個引數pthread_detach()pthread_attr_init(&attr);//對引數進行初始化
pthread_attr_setdetachstate(&attr, pthread_create_joinable);//設定執行緒為可連線的
pthread_attr_setdetachstate(&attr, pthread_create_detached);//設定執行緒為可分離的
pthread_attr_destroy(&attr)//銷毀屬性,防止記憶體洩漏
函式原型
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 = 1thread1: 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時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...