執行緒函式之間執行時存在先後關係,則成為同步
解決辦法:訊號量
訊號量也是乙個變數,需要初始化
1. sem_init 函式形式:int
sem_init
(sem_t *sem,
int pshared,
unsigned
int value)。
功能:初始化訊號量值。
引數:sem為訊號量變數指標;pshared指定訊號量是由程序內線程共享,還是由程序之間共享,若為了0則是執行緒共享,若為非0則為程序共享;value指定訊號量sem初始值。
函式返回值:成功返回0,出錯返回-
1。2. sem_wait // p操作
函式形式:int
sem_wait
(sem_t * sem) 。
功能:sem_wait將訊號量的值減1。原子操作就是如果兩個執行緒企圖同時給乙個訊號量加1或減1,它們之間不會互相干擾。訊號量為乙個非零值時,訊號量的值減去「1」,若訊號量值為零則執行緒阻塞。例如,如果對乙個值為2的訊號量呼叫sem_wait函式時,執行緒將會繼續執行,但訊號量的值變為1。如果對乙個值為0的訊號量呼叫sem_wait函式時,執行緒就會阻塞,直到其它執行緒使訊號量值不再是0為止。
引數:sem為訊號量變數指標。
函式返回值:成功返回0,出錯返回-
1。3. sem_post // // v操作
函式形式:int
sem_post
(sem_t * sem) 。
功能:sem _post以原子操作的方式將訊號量的值加1。
引數:sem為訊號量變數指標。
函式返回值:成功返回0,出錯返回-
1。
//目的,fun1和fun2先同時執行5秒,後等fun2執行完之後再執行fun1
#include
#include
#include
#include
sem_t var;
//定義乙個全域性的訊號量變數
void
*fun1
(void
*s)sem_wait
(&var)
;//執行5秒之後fun1睡眠
for(i =
5; i <
10; i++
)return
null;}
void
*fun2
(void
*s)sem_post
(&var)
;//fun2執行結束之後喚醒fun1繼續開始執行
return
null;}
intmain
(void)if
((ret =
pthread_create
(&tid2,
null
, fun2,
(void
*)buf2))==
-1)pthread_join
(tid1,
null);
pthread_join
(tid2,
null);
puts(""
);return0;
}
多工之間(假設a和b), 若a先得到共有資源,則其b務必須等a操作結束後,才可以操作。
解決辦法:互斥鎖
互斥鎖是乙個變數,這個變數要初始化。
1. pthread_mutex_init
函式形式:int pthread_mutex_init (pthread_mutex_t *mutex, pthread_mutexatter_t *attr)
;。 功能:初始化互斥鎖值。
引數:mutex為互斥鎖變數指標;attr為互斥鎖的屬性,若設為null,則為普通鎖(執行緒)。
函式返回值:成功返回0,出錯返回-
1。2. pthread_mutex_lock
函式形式:int
pthread_mutex_lock
(pthread_mutex_t *mutex)。
功能:pthread_mutex_lock讓互斥鎖上鎖,如果互斥鎖mutex已被另乙個執行緒鎖定和擁有,則呼叫該執行緒將阻塞,直到該互斥鎖變為可用為止。
引數:mutex為互斥鎖變數指標。
函式返回值:成功返回0,出錯返回-
1。3. pthread_mutex_unlock
函式形式:int
pthread_mutex_unlock
(pthread_mutex_t *mutex)。
功能:釋放鎖。
引數:mutex為互斥鎖變數指標。
函式返回值:成功返回0,出錯返回-
1。
#include
#include
#include
pthread_mutex_t var;
//首先定義乙個全域性變數
void
*fun1
(void
*s)pthread_mutex_unlock
(&var)
;//解鎖,使得fun2可以執行
return
null;}
void
*fun2
(void
*s)pthread_mutex_unlock
(&var)
;//解鎖,使得fun1可以執行
互斥操作往往只設定乙個訊號量並設初值為1 ,如果有程序占用,那麼其他程序就無法使用
同步操作往往設定多個訊號量,並設定不同的初值來實現同步操作
執行緒的同步和互斥
1 一些基本概念 互斥 在同一時間內訪問資源的唯一性 同步 是一種時序性和協作性 臨界資源 一次僅允許乙個程序使用的資源 臨界區 訪問臨界資源的一段 2 為什麼要進行同步?互斥?執行緒互斥 因為多個執行緒是用共享乙個資源的,這個資源就是臨界資源,多個執行緒對資源的訪問就需要用到執行緒的同步和互斥。執...
執行緒同步與互斥 實現互斥鎖
今天我們來分享一下,執行緒同步與互斥 互斥鎖的實現。多個執行緒同時訪問共享資料時可能會產生衝突,造成程式執行結果不是我們所預期的結果。不產生衝突的多執行緒訪問情況,和截圖如下 產生衝突的多執行緒訪問情況,和截圖如下 注 每執行一次,結果都可能會不同。由於多執行緒訪問共享資料時可能會產生衝突,不能保證...
執行緒同步互斥的控制方法
四種程序或執行緒同步互斥的控制方法 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。2 互斥量 為協調共同對乙個共享資源的單獨訪問而設計的。3 訊號量 為控制乙個具有有限數量使用者資源而設計。4 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。臨界區...