續接上一部分執行緒通訊(一)的內容
執行緒的同步和互斥:
進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決
執行緒之間對資源的競爭:
1. 互斥量
mutex
2. 訊號燈
semaphore
3. 條件變數
conditions
mutex互斥鎖線程控制
互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。
互斥鎖只有兩種狀態,也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全域性變數。
在同一時刻只能有乙個執行緒掌握某個互斥鎖,擁有上鎖狀態的執行緒能夠對共享資源進行操作。若其他執行緒希望上鎖乙個已經被上鎖的互斥鎖,則該執行緒就會掛起,直到上鎖的執行緒釋放掉互斥鎖為止。
互斥鎖可以分為快速互斥鎖、遞迴互斥鎖和檢錯互斥鎖。
這三種鎖的區別主要在於其他未占有互斥鎖的執行緒在希望得到互斥鎖時是否需要阻塞等待。
快速鎖是指呼叫執行緒會阻塞直至擁有互斥鎖的執行緒解鎖為止。
遞迴互斥鎖能夠成功地返回,並且增加呼叫執行緒在互斥上加鎖的次數,
而檢錯互斥鎖則為快速互斥鎖的非阻塞版本,它會立即返回並返回乙個錯誤資訊。
預設屬性為快速互斥鎖。
互斥鎖線程控制
執行緒之間的同步和互斥
pthread_mutex_init()
函式的作用:互斥鎖的初始化
函式的標頭檔案:#include
函式的原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr *attr)
函式的引數:
mutex:互斥鎖
mutexattr:
pihread_mutex_initializer
快速互斥鎖
函式的返回值:
成功:返回 0
出錯:返回
< 0
作用:對互斥鎖上鎖、判斷上鎖、解鎖、清除互斥鎖
互斥鎖上鎖:pthread_mutex_lock(pthread_mutex_t *mutex)
互斥鎖判斷上鎖:pthread_mutex_trylock(pthread_mutex_t *mutex)
互斥鎖接鎖:pthread_mutex_unlock(pthread_mutex_t *mutex)
消除互斥鎖:pthread_mutex_destroy(pthread_mutex_t *mutex)
函式的返回值:
成功: 0 出錯: -1
示例**:
#include #include #include #define thread_num 3
#define repeat_num 3
#define delay_time_levels 6.0
pthread_mutex_t mutex;
void *thrd_func(void *arg)
sem_init()
函式的作用:初始化訊號
函式的標頭檔案:#include
函式的原型:int sem_init(sem_t *sem, int pshare, unsigned int value)
函式的引數:
pshare:0
sem:訊號量指標
value:訊號裡初始化
函式的返回值:
成功:返回0
出錯:返回 -1
訊號量的pv操作:
函式的原型:
int sem_wait(sem_t *sem)------------p操作
int sem_trywait(sem_t *sem)
int sem_post(sem_t *sem)------------v操作
int sem_getvalue(sem_t *sem)
int sem_destroy(sem_t *sem)
函式的引數:
sem:訊號裡指標
示例**:執行緒的pv操作
#include #include #include #include #include #include #include #include int buff;
sem_t mutex,full;
int fd;
void inputnumber(void *arg);
void countnumber(void *arg);
int main()
ret=pthread_create(&id1,null,(void *)inputnumber,null);
if(ret!=0)
perror("pthread cread1");
ret=pthread_create(&id2,null,(void *)countnumber,null);
if(ret!=0)
perror("pthread cread2");
pthread_join(id1,null);
pthread_join(id2,null);
exit(0);
}void inputnumber(void *arg)
printf("the input number is %d\n",buff);
sem_post(&full);//執行緒解除阻塞
}}void countnumber(void *arg)
}
Linux通訊之訊號(二)
訊號捕捉 訊號捕捉特性 核心實現訊號捕捉過程 核心通過讀取未決訊號集來判斷訊號是否應被處理,訊號遮蔽字 mask 可以影響未決訊號集。而我們可以在應用程式中自定義 set 來改變 mask。以達到遮蔽指定訊號的目的。sigset t set typedef unsigned long sigset ...
Linux 執行緒通訊
linux系統中的程序間通訊方式主要以下幾種 同一主機上的程序通訊方式 unix程序間通訊方式 包括管道 pipe 有名管道 fifo 和訊號 signal system v程序通訊方式 包括訊號量 semaphore 訊息佇列 message queue 和共享記憶體 shared memory ...
Linux多執行緒通訊
include include define buffer size 16 緩衝區數量 struct prodcons 初始化緩衝區結構 void init struct prodcons b 生產者將產品放入緩衝區,這裡是存入乙個整數 void put struct prodcons b,int ...