執行緒安全與執行緒同步

2021-09-26 07:22:55 字數 1502 閱讀 7304

執行緒安全 (可重入函式)

執行緒之間共享全域性資料段、靜態資料,引起非執行緒安全。執行緒安全可以通過執行緒同步對臨界資源訪問進行控制來實現。

有些系統呼叫或者庫函式的實現時發生不安全現象,在多執行緒環境下就需要使用這些函式的安全版本,即可重入函式。

例如:字串分割函式

普通版本:char* strtok(char* sourstr,const char* flag)

可重入版本:char* strtok_r(char* sourstr,const char* flag,char ** res)

printf()不是執行緒安全函式

執行緒同步:

四種方式:訊號量、互斥鎖、讀寫鎖、條件變數。使用者可以通過這四個方式對執行緒進行同步操作。下面分別介紹一下

訊號量:在程序間通訊時我們已經了解過訊號量了,這裡與程序間的訊號量作用相似,當執行緒訪問一些有限的共享資源的時候,就必須做到執行緒同步訪問。

訊號量的使用方式:#include

初始化:int sem_init(sem_t *sem,int shared,int val);

p操作:對訊號量sem進行-1操作,如果結果小於0,此函式會阻塞,直到其他執行緒執行v操作。

int sem_wait(sem_t *sem);

v操作:對訊號量sem進行+1操作

int sem_post(sem_t *sem);

銷毀:銷毀訊號量

int sem_destroy(sem_t *sem);

互斥鎖的使用方式:#include

初始化:int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t *attr);

加鎖:int pthread_mutex_lock(pthread_mutex_t* mutex);

解鎖:int pthread_mutex_unlock(pthread_mutex_t* mutex);

銷毀鎖:int pthread_mutex_destroy(pthread_mutex_t* mutex);

條件變數:用於執行緒之間同步共享資料的值,條件變數提供了一種執行緒間的通訊機制:當共享資料達到某個值時,喚醒這個共享資料的執行緒。

條件變數的使用方式:#include

初始化條件變數:int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t *cond_attr);

銷毀條件變數:int pthread_cond_destroy(pthread_cond_t* cond);

以廣播的方式喚醒所有等待條件變數的執行緒:int pthread_cond_broadcast(pthread_cond_t* cond);

喚醒乙個等待目標變數的執行緒:int pthread_cond_signal(pthread_cond_t* cond);

等待目標條件變數:int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);

執行緒安全與同步執行緒

資料有負數,相同的情況 比如在進行搶票的時候。可能會出現在第資料不準確的現象 public class unsafe implements runnable public static void test catch interruptedexception e system.out.println...

執行緒同步 執行緒安全

1 執行緒同步 1 同步 多程序或者多執行緒訪問臨界資源時,必須進行同步控制。多程序或者多執行緒的執行並不完全是絕對的並行執行,有可能主線程需要等待函式執行緒的某些條件的發生。2 多執行緒之間有幾個特殊的臨界資源 全域性資料 堆區資料 檔案描述符 多執行緒之間共用 3 執行緒間同步控制方式 a.訊號...

執行緒同步和執行緒安全

執行緒同步,嚴格來說,是程式通過專用的機制來保證多個並行執行的執行緒在同一時刻不會執行指定的程式段。的執行緒安全,指的是多執行緒以安全執行的方式操作共享資料結構。或者簡單的說,就是程式在多執行緒環境下執行而不會引發資料錯誤。有多種策略實現執行緒安全的資料結構。執行緒同步是現實執行緒安全的一種手段。不...