之前自己寫過乙個所謂的執行緒總結,那是剛學習的時候,想的只是怎麼建立執行緒,後來剖析原始碼的時候發現了自己在這方面知識的匱乏,於是最近痛定思痛,再去去看了一遍多執行緒程式設計。
根據執行環境和排程者身份:
執行緒可以分為核心執行緒和使用者執行緒。
核心執行緒由核心來排程,執行在核心空間
使用者執行緒執行在使用者空間由執行緒庫來排程。
當程序的乙個核心執行緒獲得cpu使用權時,它就載入並執行乙個使用者執行緒。
核心執行緒相當於使用者執行緒的"容器",乙個執行緒可以擁有m個核心執行緒和n個使用者執行緒,其中m<=n,並在每個系統中m,n的比值是固定的。
執行緒實現的三種模式
完全在使用者空間實現
完全由核心排程 1:1
雙層排程
linuxthreads和nptl都是1:1的方式實現的。
現代linux上預設使用的執行緒庫是nptl。
#include
建立乙個執行緒的函式pthread_create:
int pthread_create(pthread_t *thread,const pthread_attr_t* attr,void*(*start_routine)(void*),void* arg);
thread:新執行緒的識別符號,pthread_t是乙個整型型別
attr:用於設定新執行緒的屬性,傳遞null則是表示使用預設執行緒屬性
statr_routine:指定新執行緒將執行的函式
arg:指定新執行緒的引數
pthread_create成功時返回0,失敗時返回錯誤碼。
執行緒的退出:
#include
void pthread_exit(void* retval);
執行緒的**:
pthread_jion,乙個執行緒中所有的執行緒都可以呼叫此函式來**其他執行緒(只要他是可**的),也就是等待其他執行緒結束,這類似於**程序的wait和waitpid系統呼叫。
#include
int pthread_join(pthread_t thread,void** retval);
thread是目標執行緒的識別符號
retval引數則是目標執行緒返回的退出資訊,成功的話就返回0,失敗就返回錯誤碼。
#include
int pthread_cancel(pthread_t thread);
有時候我們希望異常終止乙個執行緒,也就是取消執行緒,可以用這個函式來實現。
thread就是目標執行緒的識別符號,該函式成功時返回0,失敗則返回錯誤碼。
接收到取消請求的目標執行緒也可以決定允許被取消還是不允許。
#include
int pthread_stecancelstate(int state,int* oldstate);//狀態
int pthread_stecanceltype(int type,int* oldtype);//型別
14.3執行緒屬性
這個太雜了我的書給的也只是說一下,並不能總結什麼,用到的時候查(由於目前還是基礎所以沒怎麼用到這個)
之前的內容我之前的部落格也有,就不划重點了,還有就是關於互斥量和條件變數api的總結原先寫了。。忘記儲存了,所以就不加了。。。具體實現和使用可以直接參考我發上來的**
posix訊號量
多執行緒程式也必須考慮同步問題。
三種專門用於執行緒同步的機制:
posix訊號量
互斥量條件變數
常用的posix訊號量函式
#include
int sem_init(sem_t* sem,int pshared,unsigned int value);
int sem_destroy(sem_t* sem);
int sem_wait(sem_t* sem);//相當於p操作
int sem_trywait(sem_t *sem);
int sem_post(sem_t* sem);//相當於v操作
標頭檔案不想分文件我就直接在標頭檔案定義了
#include
#include
//封裝訊號量的類
//建立並初始化訊號量
//sem,posix訊號量
int initsem(sem_t *sem)
return 1;//成功返回0
}int destroysem(sem_t *sem)
//同上
return 1;
}int waitsem(sem_t* sem)//等待,作用相當於pv操作的-1
return 1;
}int postsem(sem_t *sem)
return 1;
}//互斥鎖
void initmutex(pthread_mutex_t* mutex)//這個基本和上面一致,想要看是否成功
//就設定返回值0成功,非0失敗,我就不寫了
void destroymutex(pthread_mutex_t* mutex)
void lockmutex(pthread_mutex_t *mutex)
void unlockmutex(pthread_mutex_t* mutex)
條件變數
void initcond(pthread_cond_t* cond)
//初始化乙個條件變數
void destroycond(pthread_cond_t* cond)
void broadcond(pthread_cond_t* cond)
//喚醒所有等待目標條件變數的執行緒
void signalcond(pthread_cond_t* cond)//用於喚醒乙個等待目標條件變數的執行緒
//至於那個被喚醒則取決於執行緒的優先順序和排程策略
//等待目標條件變數,mutex函式保證條件變數的互斥鎖來保證等待的原子性。
void waitcond(pthread_cond_t* cond,pthread_mutex_t* mutex)
posix訊號量和互斥鎖的應用
#include
//#include
#include
#include "lock.h"
//1 sem_t sem1,sem2;
pthread_mutex_t mutex1,mutex2;
void* fun1(void* arg)
pthread_exit((void*)"thread1 exit\n");
}void* fun2(void* arg)
pthread_exit((void*)"thread2 exit\n");
}int main(int argc,char* argv)
條件變數的應用
#include
//#include
#include
#include "lock.h"
//1 sem_t sem1,sem2;
pthread_mutex_t mutexcond;
pthread_cond_t cond;
void* fun1(void* arg)
pthread_exit((void*)"thread1 exit\n");
}void* fun2(void* arg)
pthread_exit((void*)"thread2 exit\n");
}int main(int argc,char* argv)
多執行緒程式設計總結
面試中問到這三個小問題 1 多執行緒主要用於什麼上?舉幾個例子 2 開啟乙個word是程序還是執行緒?開啟之後開啟了很多word檔案是執行緒還是程序?3 計算器軟體的執行時程序的還是多執行緒的?答 1 具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於乙個執行緒。生產者 消費者模型的滑鼠螢...
MFC多執行緒程式設計總結
mfc多執行緒程式設計總結 mfc中,在多個執行緒之間通話 資料共享與同步的方法有 1.全域性變數。全域性變數需要用volatile宣告以防止使用暫存器導致出錯。也可以使用interlockedincrement在阻塞其它執行緒的條件下修改單個全域性變數。這是一種簡單的在同一程序中線程之間通話與資料...
MFC多執行緒程式設計總結
在mfc程式中使用afxbeginthread函式來建立乙個執行緒,該函式因引數不同而具有兩種過載函式,分別對應工作者執行緒和使用者介面 ui 執行緒。一 工作執行緒 1 建立執行緒mfc api函式 cwinthread afxbeginthread afx threadproc pfnthrea...