設計安全的多執行緒應用程式 執行緒安全

2021-04-22 17:47:20 字數 1603 閱讀 5362

以前常聽高手告誡mfc物件不要跨執行緒使用,因為mfc不是執行緒安全的。比如cwnd物件不要跨執行緒使用,可以用視窗控制代碼(hwnd)代替。 csocket/casyncsocket物件不要跨執行緒使用,用socket控制代碼代替.

那麼到底什麼是執行緒安全呢?什麼時候需要考慮?如果程式涉及到多 執行緒的話,就應該考慮執行緒安全問題。比如說設計的介面,將來需要在多執行緒環境中使用,或者需要跨執行緒使用某個物件時,這個就必須考慮了。個人的理解是,所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不 用考慮同步的問題。

一般而言「執行緒安全」由多執行緒對共享資源的訪問引起。下面是幾個常見的情況,

執行緒不安全的情況:

1,呼叫某個介面時需要我們自己採取同步措施來保護該介面訪問的共享資源

執行緒安全的情況:

1,介面中訪問的資料都屬於私有資料

2,幾個介面對共享資料都是唯讀操作

3,多個介面之間有共享資料,而且有讀有寫的話,如果設計者自己採取了同步措施,呼叫者不需要考慮資料同步問題

下面以c#為例說明如果執行緒安全使用的情況。

考慮下面的示例:

public

class

widgetmanipulator

public

void

removewidgets()

}此類公開兩個方法。乙個方法 (addwidget) 將 1 新增到 totalwidgets 欄位並將該值寫入控制台。第二個方法從 totalwidgets 的值減 10。假設兩個執行緒同時試圖訪問 widgetmanipulator 類的同乙個例項,請考慮將發生什麼情況。在乙個執行緒呼叫 addwidget 的同時另乙個執行緒可能呼叫 removewidgets。這種情況下,totalwidgets 的值可能會在第乙個執行緒報告準確值之前就被第二個執行緒更改。這種爭用狀態可能導致報告的結果不準確並可能導致資料損壞。

您可以通過使用「鎖」來保護**的關鍵部分免受爭用狀態的損壞。鎖(在 c# 中用關鍵字lock語句表示)允許單個執行執行緒獲得對某個物件的獨佔執行許可權。下面的示例對鎖進行了演示:

public

void

function()}

當遇到鎖時,對指定物件(在上例中為 myobject)的執行將被阻塞,直到該執行緒獲得對該物件的獨佔訪問權為止。當達到鎖的末尾時,鎖將被釋放,執行繼續正常進行。您只能在返回引用的物件上獲得鎖。不能用這種方式鎖定值型別。

雖 然使用鎖可以保證多個執行緒不會同時訪問乙個物件,但是它們可能會導致明顯的效能降低。假設正在執行乙個包含多個不同執行緒的程式。如果每個執行緒都需要使用一 個特定的物件並且必須等待到獲得該物件的專用鎖後才能執行,則這些執行緒都將停止執行,乙個排在另乙個的後面,從而導致效能降低。由於上述原因,只應該在具 有必須作為乙個單元執行的**時使用鎖。例如,您可能更新相互依賴的多個資源。這種**稱作「原子」**。通過將鎖的使用範圍限制在必須以原子方式執行的 **,就可以編寫既能確保**安全又能保持良好效能的多執行緒元件。

還要小心地避免可能發生「死鎖」的情況。在發生這種情況時,多個執行緒彼 此都等待對方釋放共享資源。例如,執行緒 1 可能擁有對資源 a 的鎖,而在等待資源 b。而另一方面,執行緒 2 可能擁有對資源 b 的鎖,而在等待資源 a。這種情況將使得兩個執行緒都無法進行。避免死鎖情況的唯一方法是仔細程式設計。

Linux應用程式設計 多執行緒

執行緒優點是執行緒的上下文切換的開銷比建立程序小很多。在 linux 中,一般 pthread 執行緒庫是一套通用的執行緒庫,是由 posix 提出的,因此具有很好的可移植性。pthread create pthread exit pthread join pthread cancel pthrea...

建立多執行緒應用程式

定義命名空間在.net中,多執行緒功能是在system.threading命名空間中定義的。usingsystem.threading 啟動執行緒system.threading命名空間中的thread類代表乙個執行緒物件,用這個類物件可以建立新的執行緒,刪除 暫停和恢復執行緒。下面的 使用thre...

建立多執行緒應用程式

定義命名空間 在.中,多執行緒功能是在system.threading命名空間中定義的。usingsystem.threading 啟動執行緒 system.threading命名空間中的thread類代表乙個執行緒物件,用這個類物件可以建立新的執行緒,刪除 暫停和恢復執行緒。下面的 使用threa...