1、執行緒同步
(1)同步: 多程序或者多執行緒訪問臨界資源時,必須進行同步控制。多程序或者多執行緒的執行並不完全是絕對的並行執行,有可能主線程需要等待函式執行緒的某些條件的發生。
(2)多執行緒之間有幾個特殊的臨界資源:
全域性資料、堆區資料、檔案描述符 多執行緒之間共用
(3)執行緒間同步控制方式:
a. 訊號量
獲取: int sem_init(sem_t *sem, int shared , int value);
sem: 是乙個 sem_t 型別指標,指向訊號量物件。
shared: 是否能在多程序間共享, linux 不支援, 0
value: 訊號量的初始值
返回值: 0 成功 -1 失敗
p 操作: int sem_wait(sem_t *sem); // 阻塞執行
v 操作: int sem_post(sem_t *sem);
刪除: int sem_destroy(sem_t *sem);
b. 互斥鎖
概念:完全控制臨界資源,如果乙個執行緒完成加鎖操作,則其他執行緒無論如何都無法再完成加鎖,也就無法對臨界資源進行訪問。
初始化:int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutex_attr_t *attr);
加鎖:int pthread_mutex_lock(pthread_mutex_t *mutex); // 阻塞執行
int pthread_mutex_trylock(pthread_mutex_t *mutex); //非阻塞版本
解鎖:int pthread_mutex_unlock(pthread_mutex_t *mutex);
釋放:int pthread_mutex_destroy(pthread_mutex_t *mutex);
c.條件變數
2、執行緒安全 —> 可重入函式有些庫函式會使用執行緒間共享的資料,如果沒有同步控制,執行緒操作就是不安全的,所以,我們使用這樣一些函式時,就必須使用其安全的版本 —》可重入函式.
子程序會繼承其父程序的鎖以及鎖的狀態,但是父子程序用的不是同一把鎖,父程序解鎖並不會影響到子程序的鎖,所以子程序有可能死鎖。
pthread_atfork(void (*prepare)(void), void (*parent)(void ), void (*child)(void));
指定在 fork 呼叫之後,建立子程序之前, 呼叫 prepare 函式,獲取所有的鎖,然後建立子程序, 子程序建立以後,父程序環境中呼叫 parent 解所有的鎖,子程序環境中呼叫 child 解所有的鎖,然後 fork 函式再返回。這樣保證了 fork 之後,子程序拿到的鎖都是解鎖狀態,避免死鎖。
執行緒同步和執行緒安全
執行緒同步,嚴格來說,是程式通過專用的機制來保證多個並行執行的執行緒在同一時刻不會執行指定的程式段。的執行緒安全,指的是多執行緒以安全執行的方式操作共享資料結構。或者簡單的說,就是程式在多執行緒環境下執行而不會引發資料錯誤。有多種策略實現執行緒安全的資料結構。執行緒同步是現實執行緒安全的一種手段。不...
執行緒安全與執行緒同步
執行緒安全 可重入函式 執行緒之間共享全域性資料段 靜態資料,引起非執行緒安全。執行緒安全可以通過執行緒同步對臨界資源訪問進行控制來實現。有些系統呼叫或者庫函式的實現時發生不安全現象,在多執行緒環境下就需要使用這些函式的安全版本,即可重入函式。例如 字串分割函式 普通版本 char strtok c...
執行緒安全與同步執行緒
資料有負數,相同的情況 比如在進行搶票的時候。可能會出現在第資料不準確的現象 public class unsafe implements runnable public static void test catch interruptedexception e system.out.println...