一、多執行緒
頭檔案:
#include<pthread.h>
函式宣告:
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
引數依次為:
指向執行緒識別符號的指標、設定執行緒屬性、執行緒運行函式的起始地址、傳入引數,
食用方法:
指標函式:
void *mythread_function(void *arg)
{
...
}
呼叫代碼:
...
#include <pthread.h>
...
pthread_t mythread;
pthread_create(&mythread, NULL, mythread_function, NULL)
注意:
pthread_create第4個傳參為向執行緒傳入引數,但因為只能傳入一個,所以傳參多的時候需要用struct封裝一下,
執行緒創建成功回傳0.
二、信號量
頭檔案:
#include <semaphore.h>
函式:
初始化信號量
int sem_init(sem_t *sem, int pshared, unsigned int val);
引數依次為:
信號量指標、信號量型別,信號量初始值,
第二個引數pshared為0時,該行程內所有執行緒可用,不為0時不同行程間可用,
信號量減1
int sem_wait(sem_t *sem);
說明:
該函式申請一個信號量,當前無可用信號量則等待,有可用信號量時占用一個信號量,對信號量的值減1,
信號量加1
int sem_post(sem_t *sem);
銷毀信號量
int sem_destory(sem_t *sem);
該函式銷毀信號量,
三、互斥鎖
頭檔案和執行緒的相同:
#include <pthread.h>
使用方法:
創建
方式一:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
方式二:
pthread_mutex_init函式,函式原型:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)
注:第二個引數為設定互斥鎖屬性,NULL表示默認為普通鎖,
屬性
設定方法:
方式一:
pthread_mutexattr_init(pthread_mutexattr_t *mattr);
方式二:
pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
方式三:
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
注:第二個引數為設定互斥鎖的范圍:可以指定是該行程與其他行程的同步還是同一行程內不同的執行緒之間的同步,可以設定為PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE,默認是后者,表示行程內使用鎖,
獲取鎖型別:
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
互斥鎖的型別:
1.PTHREAD_MUTEX_TIMED_NP,這是預設值,也就是普通鎖,當一個執行緒加鎖以后,其余請求鎖的執行緒將形成一個等待佇列,并在解鎖后按優先級獲得鎖,這種鎖策略保證了資源分配的公平性,
2.PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個執行緒對同一個鎖成功獲得多次,并通過多次unlock解鎖,如果是不同執行緒請求,則在加鎖執行緒解鎖時重新競爭,
3.PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個執行緒請求同一個鎖,則回傳EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP型別動作相同,這樣就保證當不允許多次加鎖時不會出現最簡單情況下的死鎖,
4.PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動作最簡單的鎖型別,僅等待解鎖后重新競爭,
鎖銷毀
int pthread_mutex_destroy(pthread_mutex_t *mutex);
加鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
解鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
嘗試加鎖(被占據時回傳EBUSY而不是掛起等待)
int pthread_mutex_trylock(pthread_mutex_t *mutex);
需要C/C++ Linux服務器架構師學習資料加群(812855908)獲取(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/195243.html
標籤:其他
上一篇:mediasoup 原始碼分析(十九)dtls 握手
下一篇:5G/NR同步信號之--SSB
