#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個資源可以使用,那麼乙個任務獲得資源以後沒有釋放,下次想再呼叫 就算是之前呼叫的這個任務也 必須等待。這是訊號量和互斥量的區別之一,之二是互斥量...