linux 中訊號量 和 互斥量的 說明

2021-06-23 09:26:12 字數 2120 閱讀 4776

#include

#include#include#includetypedef struct ct_sum

ct_sum;

void * add1(void * cnt)

pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));

pthread_exit(null);

return 0;

} void * add2(void *cnt)

pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));

pthread_exit(null);

return 0;

}

int main(void)

如上面  在多個執行緒中 為了 不發生衝突  或者說  為了有個先後順序 一旦 上鎖 我們認為 其他執行緒 就阻塞了

在多個執行緒中如果 同時併發 若同時對乙個物件訪問 會出現不可預知的情況,如果加上 互斥鎖 一次只有乙個執行緒申請到執行,只有互斥鎖釋放後,其他執行緒才能執行

linux下關於訊號量結構體表示為:sem_t

操作結構體的函式:

初始化函式: sem_init(sem_t * __sem,int __pshared,unsigned int __value);

觸發訊號量值:sem_post(sem_t * __sem);

等待訊號量觸發:

通常有:

一直等待:sem_wait(sem_t * __sem);  

測試__sem是否觸發:sem_trywait(sem_t * __sem); 

等待超時:sem_timedwait(sem_t * __restrict __sem, __ const struct timespec * __restrict __abstime);

釋放銷毀訊號量:

sem _destroy(sem_t * __sem);

sem_wait(sem_t * __sem);  作用類似於把 信量的值減一 而  sem_post(sem_t * __sem);是將訊號量的值加一

對於初始值為 1的 訊號量  也可以作為 訊號鎖使用 我們稱之為  用於互斥的訊號量

#include#include#include#includepthread_mutex_t mutex;

pthread_t id1;

pthread_t id2;

pthread_t id3;

sem_t sem1;

sem_t sem2;

sem_t sem3;

void* msg(void *arg)

pthread_mutex_unlock(&mutex);

sem_post(&sem1);

}void * gff(void *arg)

int main(int argc,char **argv)

結果為:01

2012

gff_test

一共三個程序 msg 申請互斥鎖後 其他兩個 執行緒 阻塞,

下面經過 修改後 訊號量 可實現 互斥的作用   或者 也可稱為  互鎖

#include#include#include#includepthread_mutex_t mutex;

pthread_t id1;

pthread_t id2;

pthread_t id3;

sem_t sem1;

sem_t sem2;

sem_t sem3;

int i=0;

void* msg(void *arg)

//pthread_mutex_unlock(&mutex);

sem_post(&sem1);

sem_post(&sem2);

}void * gff(void *arg)

int main(int argc,char **argv)

結果

msg get sem1

gff get sem2

訊號量和互斥量

1.互斥量用於執行緒的互斥,訊號線用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。互斥 是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步 是指在互斥的基礎上 大多數情況 通過其它機制實現訪問者對資...

訊號量 互斥量

lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...

RTX 互斥量 和 訊號量

互斥量 如果乙個任務獲得資源以後沒有釋放,下次執行時候這個任務本身不必再等待,直接擁有這個資源的使用權,但別的任務要使用只能等待。訊號量 假設初始化時只有1個資源可以使用,那麼乙個任務獲得資源以後沒有釋放,下次想再呼叫 就算是之前呼叫的這個任務也 必須等待。這是訊號量和互斥量的區別之一,之二是互斥量...