執行緒互斥和同步的實現方法

2021-10-05 18:20:45 字數 3175 閱讀 4244

執行緒函式之間執行時存在先後關係,則成為同步

解決辦法:訊號量

訊號量也是乙個變數,需要初始化

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 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。臨界區...