執行緒同步 互斥鎖

2021-08-18 18:11:14 字數 1562 閱讀 2769

一:為什麼要用多執行緒?

避免阻塞:乙個程序如果只有乙個執行緒的話,當這個乙個執行緒阻塞則就整個程序阻塞,無法再去完成其他事情。

提高效率,避免cpu空**程式經常涉及讀寫操作就會訪問磁碟,這些操作的速度比cpu慢的多,而為了等待這些操作的響應,cpu又不能去幹其他的事情或者處理新的請求,導致這種單執行緒的程式效能差。而多執行緒會共享同一位址空間,執行緒的切換比程序快。

二:linux提供執行緒同步的方式:

(一):互斥鎖(mutex)

通過鎖機制;同一時刻只允許乙個執行緒執行關鍵部分**。

1.初始化互斥鎖

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr)
引數:

mutex:互斥鎖位址,型別pthread_mutex_t

mutexattr:互斥鎖的屬性,通常設為null

也可以通過巨集:pthread_mutex_initalizer靜態初始化互斥鎖;

pthead_mutex_t mutex =pthread_mutex_initalizer;
這種方式等價於指定引數 mutexattr為null呼叫pthread_mutex_init()函式。

返回值:

成功:0,成功申請的鎖默開啟的。

失敗:非0錯誤碼

2,上鎖和解鎖

int pthread_mutex_lock(pthread_mutex_t *mutex);(和阻塞)

int pthread_mutex_trylock(pthread_mutex_t *mutex);(非阻塞,得不到鎖就立刻返回,並且ebusy錯誤)

int pthread_mutex_unlock(pthread_mutex_t *mutex);

3,銷毀鎖

int pthread_mutex_destroy(pthread_mutex_t *mutex);
例子:建立兩個執行緒,乙個列印hello,乙個列印world;

#include

#include

#include

pthread_mutex_t mutex;

void printer(char* str)

printf("\n");

pthread_mutex_unlock(&mutex); //解鎖

}void* pthread_func1(void* arg)

void* pthread_func2(void* arg)

int main()

結果:

如果不加鎖:就會亂序的列印:

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步1 互斥鎖

和多程序相比,多執行緒的最大特點就是資源的共享。然而共享卻涉及到乙個同步的問題,這是多執行緒程式設計的難點。linux系統提供了多種方式處理執行緒間的同步問題,主要有互斥鎖 條件變數和非同步訊號。本文先講互斥鎖。互斥鎖通過鎖機制來實現執行緒間的同步。在同乙個時刻,只允許乙個執行緒執行乙個關鍵部分的 ...