.NET簡談組件程序設計之(上下文與同步域)

我們繼續學習.NET多線程技術,這篇文章的內容可能有點復雜。在打破常理之后,換一種新的思考模型最為頭疼。這篇文章里面會涉及到一些不太常見的概念,比如:上下文、同步域等等。我也是最近才接觸這些關于組件編程方面的高深技術,大家一起學習,再大的困難也是有時間限制的,只要我們堅持。

在本人的上一篇文章“.NET簡談組件程序設計之(多線程與并發管理一)”中,只是初步的帶領我們學習一下關于多線程的一些基本的原理,包括線程切換,線程的開始、執行、等待、結束。

這篇文章的重點是學習關于線程的同步、互斥的機制。在多線程的應用程序中,最少會有一個主線程在運行著,如果我們想提高應用程序的吞吐量就必須借助多線程的原理來實現。[王清培版權所有,轉載請給出署名]

.NET上下文(ContextBoundObject對象)

什么叫上下文,千萬別和ASP.NET中的上下文搞混了,這個上下文是個形容詞,在不同的場合有不同的意思。在ASP.NET中的上下文是指Context對象,這個對象基本上包容了HTTP協議的整個生命周期的信息,可以獲取到客戶端瀏覽器的一些基本信息,也可以獲取到關于HTTP協議的一些信息,等等。

這里所講的上下文是.NET程序執行的最小邏輯范圍,ASP.NET上下文是站在B/S編程模型角度去看待的,而這里的上下文是站在.NET底層運行角度看來的,后者是代碼的上下文,前者是整個生命周期的上下文。

在沒有接觸ContextBoundObject之前我一直以為.NET程序執行的最小邏輯范圍是應用程序域(AppDomain),知道了之后才知道另有隱情,上下文是用來確定對象的邏輯歸屬,在多線程(Thread)、事物處理(Transaction)、企業服務(Enterprise)等方面都需要用上下文來對對象進行規劃。下面您將看到怎么用上下文來進行線程的同步的。

圖1:

.NET同步域(Synchronization特性)

同步域的概念是來源于多線程的場合,在我們進行多線程操作的時候,讓很多個線程去同時訪問一個內存對象的時候,是必須用鎖來保證只有一個線程進入對象操作的,那么同步域的概念就是同步的是一個區域,而不是單單的一個對象。

線程是代碼的執行路徑,只要在這條執行路徑上都屬于線程的范圍,那么怎么在執行的路徑中分離出另外一個同步區域。[王清培版權所有,轉載請給出署名]

臨界資源是系統中對同一時間只能由一個線程進行訪問的描述。我們假設自己就是一個線程,我們要去家里拿點東西,那么門就是線程的同步鎖,當我們進去的時候就把門從里面反鎖,出去的時候就把門打開,以方便自己的家人進來。這個房子就是臨界資源。可能這樣的描述不太靠譜,哪有這樣的家啊!

圖2:

利用上下文和同步域進行線程的同步

下面我們將結合上下文和同步域的原理進行線程的同步。請看一段代碼:

 
  1. using?System; ?
  2. using?System.Collections.Generic; ?
  3. using?System.Text; ?
  4. using?System.Threading; ?
  5. using?System.Runtime.Remoting; ?
  6. using?System.Runtime.Remoting.Contexts; ?
  7. ?
  8. namespace?ConsoleApplication1.多線程和并發管理 ?
  9. { ?
  10. ????//如果不加上下文,那么就是以對象為線程鎖定區域,如果加上下文,那么就是已邏輯上下文為鎖定區域 ?
  11. ????[Synchronization(SynchronizationAttribute.REQUIRED,?true)]//重新進入同步域 ?
  12. ????public?class?MyClass?:?ContextBoundObject ?
  13. ????{ ?
  14. ????????public?void?DoWork() ?
  15. ????????{ ?
  16. ?
  17. ????????????int?i?=?0; ?
  18. ????????????while?(true) ?
  19. ????????????{ ?
  20. ????????????????Console.WriteLine(Thread.CurrentThread.ManagedThreadId?+?"|"?+?i++); ?
  21. ????????????????if?(i?==?10) ?
  22. ????????????????{ ?
  23. ????????????????????Console.WriteLine("---------------------------------------------"); ?
  24. ????????????????????Console.Read(); ?
  25. ????????????????????break; ?
  26. ????????????????} ?
  27. ????????????} ?
  28. ?
  29. ????????} ?
  30. ????} ?
  31. } ?

在這段代碼里面,我給Myclass類加上了Synchronization特性,并且繼承自上下文對象ContextBoundObject。兩者必須集合使用,同步域只有在上下文中才有效。

【MSDN:將?SynchronizationAttribute?應用到一個上下文綁定對象會導致創建等待句柄和自動重置事件,這些內容不一定會被作為垃圾來回收。因此,不要在很短的時間內創建大量用?SynchronizationAttribute?標記的上下文綁定對象。】

圖3:

?

圖4:

我們來看調用代碼:

 
  1. Thread?currentthread?=?Thread.CurrentThread; ?
  2. ????????????Console.WriteLine(currentthread.Name?+?currentthread.ManagedThreadId); ?
  3. ?
  4. ????????????MyClass?myclass?=?new?MyClass(); ?
  5. ?
  6. ????????????Thread?thread?=?new?Thread(new?ThreadStart(myclass.DoWork)); ?
  7. ?
  8. ?
  9. ????????????Thread?thread2?=?new?Thread(new?ThreadStart(myclass.DoWork)); ?
  10. ????????????thread2.Start(); ?
  11. ????????????thread.Start(); ?
  12. ?
  13. ????????????thread2.Join(); ?
  14. ????????????thread.Join(); ?
  15. ????????????Console.WriteLine(currentthread.Name?+?currentthread.ManagedThreadId); ?
  16. ????????????Console.Read();?

圖5:

我為了方便截圖所以把循環的數字設的比較小,如果你想測試一下,可以把數字設的大一點。[王清培版權所有,轉載請給出署名]

在SynchronizationAttribute對象里面有幾個枚舉值,是用來確定是否共享一個同步域的,有興趣的可以自己嘗試,我就不在這里多講了。

總結:同步域和上下文對象是線程自動同步的好方法,但是他鎖定的目標太大,難免導致系統的吞吐量下降,所以下面幾篇文章我們將會學習怎么使用手動同步來實現更靈活的同步(Monitor、WaitHandler等),從很小的粒度進行鎖定。






?本文轉自 王清培 51CTO博客,原文鏈接:http://blog.51cto.com/wangqingpei557/652057,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257025.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

string類的各種函數用法

標準c中string類函數介紹 注意不是CString 之所以拋棄char*的字符串而選用C標準程序庫中的string類,是因為他和前者比較起來,不必 擔心內存是否足夠、字符串長度等等,而且作為一個類出現,他集成的操作函數足以完成我們大多數情況…

調用圖片按鈕的img圖片

今天是我學前端的第12天。早上起床后活動筋骨時看了《JS的基本屬性操作》&#xff0c;作業是模擬手機發送短信。文字都能傳輸到<div>上&#xff0c;就是圖片不知道怎么傳。折騰了好久才弄清楚&#xff0c;多虧了某群的小伙伴們。 這一節課&#xff0c;我學會了如何調用圖…

利用api接口來實現web網頁登陸

因為公司的所有鏈接數據庫的都是用的api接口 最近做了一個用api接口登陸 function Login() { if (!Validate()) { return false; } var para {}; para.action "login_by_api"; para.login_name $.trim($("#txtLoginName").val()); para.password $.tr…

Cisco設備做流量監控的方法

方法一&#xff1a;HUB&#xff08;方法太簡單。。。略&#xff09;方法二&#xff1a;TAP&#xff08;太專業了。。還要另外投資&#xff09;方法三&#xff1a;SPAN&#xff08;就是大家常說得Port Mirror或者Port Monitor&#xff09;1。Cat2900XL/3500XL2900XL(config)#int…

python數據結構_(列表)大O性能_學習筆記(2)

1.列表 1&#xff09;一般列表操作命令的復雜度&#xff08;準確來說是函數的復雜度&#xff09; 2&#xff09;時間計算&#xff08;timeit模塊和Timer對象&#xff09; 要捕獲我們的每個函數執行所需的時間&#xff0c;我們將使用 Python 的 timeit 模塊。timeit 模塊旨在 …

學習C++不要糾結了

阿里&#xff0c;騰訊2家公司均工作過。處理高并發的底層基本都是使用C來完成的&#xff0c;騰訊確實90%的程序員都是C程序員&#xff0c;而且基本每個C程序員都有2本磚頭書---unix 環境高級編程 和 C Primer。 阿里大部分程序員都是JAVA程序員&#xff0c;但在關鍵的節點還是會…

找到你的位置(JS在頁面中的位置)最常用的方式是在頁面中head部分放置script元素,瀏覽器解析head部分就會執行這個代碼,然后才解析頁面的其余部分...

找到你的位置&#xff08;JS在頁面中的位置&#xff09; 我們可以將JavaScript代碼放在html文件中任何位置&#xff0c;但是我們一般放在網頁的head或者body部分。放在<head>部分 最常用的方式是在頁面中head部分放置<script>元素&#xff0c;瀏覽器解析head部分就…

國內主流.NET CMS系統整理

現在只要想做一個網站&#xff0c;馬上就想到去下載一個cms來改&#xff0c;方便&#xff0c;快速&#xff0c;現如今在網上隨便搜索下CMS都出現幾十個不一樣的品牌&#xff0c;有php的、java的、.net的&#xff0c;功能上也是各有千秋&#xff0c;如何選擇一個比較適合自己的C…

數據庫的事務級別介紹與操作

關系型數據庫都具有一套事務級別&#xff0c;以前的開發和學習過程我很少關注過這個概念&#xff0c;今天搜集了一些資料&#xff0c;在 結合spring聲明式事務學習的同時&#xff0c;總結一下數據庫的事務級別與操作。 READ-UNCOMMITTED: 未提交讀 會出現臟讀、不可重復讀、幻讀…

中國做圖像處理的公司

&#xff08;1&#xff09; 北京北方獵波科技有限公司&#xff1a;http://www.northwh.com/beifangliebo/main1.html 紅外探測成像產品 &#xff08;2&#xff09; 深圳超多維光電子有限公司北京分公司&#xff1a;http://www.superd.com.cn 立體顯示設備 &#xff08;3&…

[ilink32 Error] Error: Unresolved external 'SendARP'

[ilink32 Error] Error: Unresolved external SendARP referenced from E:\APPOBJ\KSRGETMAC.OBJ #pragma link "iphlpapi.lib" 轉載于:https://www.cnblogs.com/cb168/p/5573478.html

3.cocos2dx它Menu,由menu為了實現場景切換

&#xfeff;&#xfeff;1 頭文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; class TMenu :public CCLayer { public: static CCScene * scene(); CREATE_FUNC(TMenu); bool init(); CCMenu * menu; void menuCallback(C…

Difference: throw or throw ex?

Difference: throw or throw ex? 主要區別在于throw出的堆棧詳細程度。 throw ex只是拋出在當前代碼處的錯誤。 throw 能夠更進一步&#xff0c;拋出內部調用的具體錯誤。 Just for demonstrating, if you have classes in C# as follows: using System;namespace WindowsAppl…

學習筆記01:1.1 基于概率的信任

基于概率的信任 大數定律&#xff1a;當樣本數量越來越多時&#xff0c;預測事件也就越來越接近于真實的事件&#xff0c;事件出現的頻率無窮地接近事件發生的概率建模檢驗&#xff1a;人工規則->學習模型&#xff0c;數據少則重視先驗&#xff0c;數據多則重視后驗給予概率…

人工智能數學基礎知識

方差的概念與計算公式&#xff0c;例1 兩人的5次測驗成績如下&#xff1a;X&#xff1a; 50&#xff0c;100&#xff0c;100&#xff0c;60&#xff0c;50 E(X)72&#xff1b;Y&#xff1a; 73&#xff0c; 70&#xff0c; 75&#xff0c;72&#xff0c;70 E(Y)72。平均成績相同…

學習筆記02:直播串講——3/22

去 就 就 就 接近 就 就 接近

認真分析mmap:是什么 為什么 怎么用

mmap基礎概念 mmap是一種內存映射文件的方法&#xff0c;即將一個文件或者其它對象映射到進程的地址空間&#xff0c;實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系。實現這樣的映射關系后&#xff0c;進程就可以采用指針的方式讀寫操作這一段內存&#xff…

數據庫子查詢

子查詢&#xff0c;又叫做嵌套查詢。 將一個查詢語句做為一個結果集供其他SQL語句使用&#xff0c;就像使用普通的表一樣&#xff0c;被當作結果集的查詢語句被稱為子查詢。 子查詢有兩種類型&#xff1a; 一種是只返回一個單值的子查詢&#xff0c;這時它可以用在一個單值可以…

攝像頭資料

https://blog.csdn.net/u013749068/article/details/79463736