1.初始化互斥鎖pthread_mutex_init()
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
例: pthread_mutex_t mutex;
pthread_mutex_init(&mutex, null);
2.鎖住互斥鎖pthread_mutex_lock()
int pthread_mutex_lock(pthread_mutex_t *mutex);
當乙個執行緒執行到此函式時,如果此鎖此時被另乙個執行緒使用,那麼此執行緒被阻塞,知道另乙個執行緒釋放此互斥鎖(第一次執行的執行緒可以執行,不會阻塞,後來的執行到此函式阻塞)
成功返回0,否則返回錯誤號
例:pthread_mutex_lock(&mutex);
3.測試互斥鎖pthread_mutex_trylock()
int pthread_mutex_trylock(pthread_mutex_t *mutex);
測試完後加鎖,trylock後會鎖住
錯誤返回-1
4.解鎖
pthread_mutex_unlock(&mutex);
成功返回0,否則返回錯誤號
5.銷毀互斥鎖
pthread_mutex_destroy(&mutex);
自定義條件來阻塞程序
1.初始化條件變數pthread_cond_init()
int pthread_cond_int(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
第乙個引數是指向結構pthread_cond_t的指標,第二個引數cond_attr是乙個指向結構pthread_condattr_t的指標。結構pthread_condattr_t是條件變數的屬性結構,和互斥鎖一樣我們可以用它來設定條件變數是程序內可用還是程序間可用,預設值是pthread_process_private,即此條件變數被同一程序內的各個執行緒使用
例: pthread_cond_t cond;
pthread_cond_init(&cond, null);
2.阻塞執行緒pthread_cond_wait()
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);(相當於在wait函式此處加一把鎖阻塞本執行緒,並釋放另一線程的互斥鎖,直到另一線程signal喚醒並unlock解鎖後才繼續執行,自動解鎖,等待完加鎖,執行到函式時只起阻塞作用,並解除鎖定)
第乙個引數是條件變數,第二個引數是執行緒阻塞的時候要解開的互斥鎖
例:pthread_cond_wait(&cond, &mutex);
3.喚醒執行緒pthread_cond_signal()
int pthread_cond_broadcast(pthread_cond_t *cond);
用來釋放被阻塞在條件變數cond上的執行緒,這兩個函式的區別在於當有多個執行緒都被同乙個條件變數所阻塞時:
用pthread_cond_broadcast()函式可以使所有執行緒都被喚醒
用pthread_cond_signal()時哪乙個執行緒被喚醒是由執行緒的排程策略所決定的
例:pthread_cond_singal(&cond);
4.銷毀條件變數
例:pthread_cond_destroy(&cond);
1.初始化訊號量sem_init()
int sem_init(sem_t *sem, int pshared, unsigned value);
第乙個引數為指向訊號量結構的指標
第二個引數不為0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享
第三個引數給出訊號量的初值
例: sem_t sem;
sem_init(&sem, 0, 1);
2.pv操作
v操作
int sem_post(sem_t *sem);
引數是要增加的訊號量結構體的指標,當有執行緒阻塞在這個訊號量上時,呼叫sem_post()函式會使其中的乙個執行緒解除阻塞,被解除阻塞的執行緒隨機選擇機制同樣是由執行緒的排程策略決定的。當另外乙個執行緒被解除後,訊號量又會被馬上減少到0
p操作
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
函式sem_wait()被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減1,表明公共資源經使用後減少
函式sem_trywait()的區別是當訊號量等於0時,不會阻塞當前執行緒
3.銷毀
int sem_destroy(sem_t *sem);
linux 執行緒 執行緒同步
因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...