前面我們驗證了互斥鎖能夠保證執行緒的互斥操作,讓各執行緒對全域性變數的累加的次數保證了正確性執行緒—中
互斥鎖的介面函式
互斥鎖的初始化以及銷毀函式:
初始化互斥鎖有兩種方式,一種是函式初始化,引數arr表示的是mutex的屬性,一般為null,設定為預設屬性;另一種是直接定義乙個全域性變數,並用巨集pthread_mutex_initializer初始化該變數。
互斥鎖的「加鎖」和「解鎖」函式
這裡的lock函式是阻塞式加鎖,若鎖被占用則一直處於阻塞式等待的狀態,但trylock是嘗試加鎖,若鎖被占用則返回ebusy,不是阻塞式等待。
互斥鎖也是我們前面學的二元訊號量,實現程序(執行緒)的互斥。
今天我們來進一步的了解兩個基本操作lock「加鎖」以及unlock」解鎖」如何實現?
首先我們假設第一種情況:
lock:
if(mutex > 0)
else
掛起等待;
goto
lock;
unlock:
mutex = 1;
喚醒等待mutex的執行緒
return
0;
這種情況我們可以看出」解鎖」是原子操作的
但是」加鎖」的過程涉及了對mutex變數的讀取、判斷以及修改,並不是原子操作的,在這個過程中隨時有可能被切換出去,當該執行緒執行到mutex判斷後被切出時,其當前的狀態儲存到上下文資訊中,即mutex = 0;當下乙個執行緒執行完後mutex = 1;切回到最開始的程序,根據程序的上下文資訊,恢復程序的狀態,此時mutex = 0;然後執行p操作,mutex = 1;此時這兩個執行緒都進入了臨界資源,不符合原子操作
於是我們是swap或exchange指令來實現「加鎖」,作用是把暫存器和記憶體單元的值進行交換,保證了原子操作。
lock:
move $0,%al
xchgb %al,mutex
if(al暫存器的內容》0)
else
掛起等待;
goto lock;
unlock:
movb $1,mutex
喚醒等待mutex的執行緒
return
0;
這時用exchge指令替換後的lock和unlock的實現,因為對mutex的操作只有一步,保證了原子性的操作。這才是互斥鎖的正確實 64 互斥鎖 執行緒通訊 執行緒同步
1 互斥鎖 互斥鎖使用格式 synchronized 鎖物件 注意 鎖定1份 只用1把鎖,用多把鎖是無效的 互斥鎖的優缺點 優點 能有效防止因多執行緒搶奪資源造成的資料安全問題 缺點 需要消耗大量的cpu資源 互斥鎖的使用前提 多條執行緒搶奪同一塊資源 執行緒同步的意思是 多條執行緒按順序地執行任務...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...