使用互斥鎖解決資源競爭問題

2021-09-25 11:57:19 字數 2510 閱讀 4761

互斥鎖:為資源引入乙個狀態,鎖定/非鎖定

方法1:

import threading

import time

g_num = 0

# 新增互斥鎖

mutex = threading.lock()

def test1(num):

global g_num

# 上鎖,如果之前沒有被上鎖,那麼此時上鎖成功

# 如果上鎖之前已經被上鎖則會堵塞,直到這個鎖被解開

方法2:原則:互斥鎖的範圍越小越好

import threading

import time

g_num = 0

# 新增互斥鎖

避免死鎖:

銀行家演算法:

銀行家演算法(banker』s algorithm)是乙個避免死鎖(deadlock)的著名演算法,是由艾茲格·迪傑斯特拉在2023年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。

演算法原理

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。

為保證資金的安全,銀行家規定:

(1) 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;

(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;

(4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金.

作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

Python 多執行緒資源競爭及互斥鎖

demo import threading import time g num 0 def fun add 01 num global g num for i in range num g num 1 print g num def fun add 02 num global g num for i...

Go 協程併發(並行)資源競爭問題及全域性互斥鎖

分析思路 實現 package main import fmt time 思路 1.編寫乙個函式,來計算各個數的階乘,並放入到 map中.2.我們啟動的協程多個,統計的將結果放入到 map中 3.map 應該做出乙個全域性的.var mymap make map int int,10 test 函式...

互斥鎖 解決原子性問題

原子性 乙個或多個操作在cpu執行的過程中不被中斷的特性 原子性問題的源頭是執行緒切換,作業系統做執行緒切換依賴於cpu中斷,所以禁止cpu中斷就能禁止執行緒切換。示例 在32位cpu上執行long型別變數的寫操作,long型別變數是64位,所以會被拆分為兩次寫操作 寫高32位和寫低32位 1.單核...