併發技術中同步

2022-01-11 03:56:33 字數 1677 閱讀 8689

如果程式中用到了併發技術,一段**需要修改資料,同時其他**需要訪問同一資料。

同步的型別:a.通訊  b.資料保護。

如果以下三個條件都滿足,就需要使用同步來保護資料。

多個執行緒需要安全的讀寫共享資料。

乙個執行緒進入鎖後,在鎖被釋放之前,其他執行緒是無法進入的。

鎖的使用,有四條重要的規則:

首先,要盡量限制鎖的作用範圍。應該把 lock 語句使用的物件設為私有成員,並且永遠不

要暴露給非本類的方法。每個型別通常最多只有乙個鎖。如果乙個型別有多個鎖,可考慮通

過重構把它分拆成多個獨立的型別。可以鎖定任何引用型別,但是我建議為 lock 語句定義

乙個專用的成員,就像最後的例子那樣。尤其是千萬不要用 lock(this),也不要鎖定 type

或 string 型別的例項。因為這些物件是可以被其他**訪問的,這樣鎖定會產生死鎖。

第二,要在文件中描述鎖定的內容。這種做法在最初編寫**時很容易被忽略,但是在代

碼變得複雜後就會變得很重要。

第三,在鎖定時執行的**要盡可能得少。要特別小心阻塞呼叫。在鎖定時不要做任何阻

塞操作。

最後,在鎖定時絕不要呼叫隨意的**。隨意的**包括引發事件、呼叫虛擬方法、呼叫

委託。如果一定要執行隨意的**,就在釋放鎖之後執行

多個**需要安全讀寫資料,並且這些**塊可能使用await語句。同步鎖的規則同樣適用於非同步鎖。

public

class

myclass

finally

}}

需要從乙個執行緒傳送訊號給另外乙個執行緒

public

class

myclass

private

void

initializefromanotherthread()

}

manualreseteventslim 是功能強大、通用的執行緒間訊號,但必須合理地使用

需要在**的各個部分間傳送通知,並且要求接收方必須進行非同步等待。

public

class

myclass

public

void

initialize()

}

在所有情況下都可以用 taskcompletionsource來非同步地等待:本例中,通知來自於另一

部分**。如果只需要傳送一次訊號,這種方法很適合。但是如果要開啟和關閉訊號,這

種方法就不大合適了.。

有一段高度併發的**,由於它的併發程度實在太高了,需要有方法對併發性進行限流。可以避免資料項占用太多的記憶體。

如果發現程式的cpu或者網路連線數太多了,或者記憶體占用太多,就需要進行限流。

資料流和並行**都自帶了對併發性限流的方法:

ienumerable parallelmultiplyby2(ienumerablevalues)

併發性非同步**可以使用 semaphoreslim 來限流

async task downloadurlsasync(ienumerableurls)

finally

}).toarray();

return

await

task.whenall(tasks);

}

LINUX c 併發同步

5.1 核心同步與死鎖問題 併發 兩個程序可以真正的在臨界區中同時執行。原因 1 中斷 2 軟中斷和tasklet 3 核心搶占 4 睡眠及與使用者空間的同步 5 對稱多處理 資料加鎖 1 如果有其他執行執行緒可以訪問這些資料 2 如果任何其他什麼東西都能看見它 3 幾乎訪問所有的核心全域性變數和共...

併發程式設計(4)同步併發操作

一 主要涉及 等待事件 帶有期望的等待一次性事件 在限定時間內等待 使用同步操作簡化 二 等待乙個條件或者事件 1 選擇是在等待執行緒在檢查間隙,使用 std this thread sleep for 進行週期性的間歇 2 也是優先的選擇 是,使用c 標準庫提供的工具去等待事件的發生。通過另一線程...

4 12 併發技術 sync包同步排程綜合案例

同步排程概述 本例需求摘要 本例技術棧 實現思路摘要 完整實現 import errors fmt io os sync sync atomic 給原始位元組切片起乙個類別名 type data byte type datafile struct 工廠方法 引數 path string 檔案路徑 d...