• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            cc

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              38 隨筆 :: 14 文章 :: 21 評(píng)論 :: 0 Trackbacks

            以下各節(jié)描述了在多線程應(yīng)用程序中可以用來同步資源訪問的功能和類。

            在應(yīng)用程序中使用多個(gè)線程的一個(gè)好處是每個(gè)線程都可以異步執(zhí)行。對(duì)于 Windows 應(yīng)用程序,耗時(shí)的任務(wù)可以在后臺(tái)執(zhí)行,而使應(yīng)用程序窗口和控件保持響應(yīng)。對(duì)于服務(wù)器應(yīng)用程序,多線程處理提供了用不同線程處理每個(gè)傳入請(qǐng)求的能力。否則,在完全滿足前一個(gè)請(qǐng)求之前,將無法處理每個(gè)新請(qǐng)求。

            然而,線程的異步特性意味著必須協(xié)調(diào)對(duì)資源(如文件句柄、網(wǎng)絡(luò)連接和內(nèi)存)的訪問。否則,兩個(gè)或更多的線程可能在同一時(shí)間訪問相同的資源,而每個(gè)線程都不知道其他線程的操作。結(jié)果將產(chǎn)生不可預(yù)知的數(shù)據(jù)損壞。

            對(duì)于整數(shù)數(shù)據(jù)類型的簡(jiǎn)單操作,可以用 Interlocked 類的成員來實(shí)現(xiàn)線程同步。對(duì)于其他所有數(shù)據(jù)類型和非線程安全的資源,只有使用本主題中的結(jié)構(gòu)才能安全地執(zhí)行多線程處理。

            有關(guān)多線程編程的背景信息,請(qǐng)參見:

            lock 關(guān)鍵字可以用來確保代碼塊完成運(yùn)行,而不會(huì)被其他線程中斷。這是通過在代碼塊運(yùn)行期間為給定對(duì)象獲取互斥鎖來實(shí)現(xiàn)的。

            lock 語句以關(guān)鍵字 lock 開頭,它有一個(gè)作為參數(shù)的對(duì)象,在該參數(shù)的后面還有一個(gè)一次只能由一個(gè)線程執(zhí)行的代碼塊。例如:

            public void Function()
            {
            System.Object lockThis = new System.Object();
            lock(lockThis)
            {
            // Access thread-sensitive resources.
            }
            }

            提供給 lock 關(guān)鍵字的參數(shù)必須為基于引用類型的對(duì)象,該對(duì)象用來定義鎖的范圍。在上例中,鎖的范圍限定為此函數(shù),因?yàn)楹瘮?shù)外不存在任何對(duì)該對(duì)象的引用。嚴(yán)格地說,提供給 lock 的對(duì)象只是用來唯一地標(biāo)識(shí)由多個(gè)線程共享的資源,所以它可以是任意類實(shí)例。然而,實(shí)際上,此對(duì)象通常表示需要進(jìn)行線程同步的資源。例如,如果一個(gè)容器對(duì)象將被多個(gè)線程使用,則可以將該容器傳遞給 lock,而 lock 后面的同步代碼塊將訪問該容器。只要其他線程在訪問該容器前先鎖定該容器,則對(duì)該對(duì)象的訪問將是安全同步的。

            通常,最好避免鎖定 public 類型或鎖定不受應(yīng)用程序控制的對(duì)象實(shí)例。例如,如果該實(shí)例可以被公開訪問,則 lock(this) 可能會(huì)有問題,因?yàn)椴皇芸刂频拇a也可能會(huì)鎖定該對(duì)象。這可能導(dǎo)致死鎖,即兩個(gè)或更多個(gè)線程等待釋放同一對(duì)象。出于同樣的原因,鎖定公共數(shù)據(jù)類型(相比于對(duì)象)也可能導(dǎo)致問題。鎖定字符串尤其危險(xiǎn),因?yàn)樽址还舱Z言運(yùn)行庫 (CLR)“暫留”。這意味著整個(gè)程序中任何給定字符串都只有一個(gè)實(shí)例,就是這同一個(gè)對(duì)象表示了所有運(yùn)行的應(yīng)用程序域的所有線程中的該文本。因此,只要在應(yīng)用程序進(jìn)程中的任何位置處具有相同內(nèi)容的字符串上放置了鎖,就將鎖定應(yīng)用程序中該字符串的所有實(shí)例。因此,最好鎖定不會(huì)被暫留的私有或受保護(hù)成員。某些類提供專門用于鎖定的成員。例如,Array 類型提供 SyncRoot。許多集合類型也提供 SyncRoot

            有關(guān) lock 關(guān)鍵字的更多信息,請(qǐng)參見:

            lock 關(guān)鍵字類似,監(jiān)視器防止多個(gè)線程同時(shí)執(zhí)行代碼塊。Enter 方法允許一個(gè)且僅一個(gè)線程繼續(xù)執(zhí)行后面的語句;其他所有線程都將被阻止,直到執(zhí)行語句的線程調(diào)用 Exit。這與使用 lock 關(guān)鍵字一樣。事實(shí)上,lock 關(guān)鍵字就是用 Monitor 類來實(shí)現(xiàn)的。例如:

            lock(x)
            {
            DoSomething();
            }

            這等效于:

            System.Object obj = (System.Object)x;
            System.Threading.Monitor.Enter(obj);
            try
            {
            DoSomething();
            }
            finally
            {
            System.Threading.Monitor.Exit(obj);
            }

            使用 lock 關(guān)鍵字通常比直接使用 Monitor 類更可取,一方面是因?yàn)?lock 更簡(jiǎn)潔,另一方面是因?yàn)?lock 確保了即使受保護(hù)的代碼引發(fā)異常,也可以釋放基礎(chǔ)監(jiān)視器。這是通過 finally 關(guān)鍵字來實(shí)現(xiàn)的,無論是否引發(fā)異常它都執(zhí)行關(guān)聯(lián)的代碼塊。

            有關(guān)監(jiān)視器的更多信息,請(qǐng)參見監(jiān)視器同步技術(shù)示例

            使用鎖或監(jiān)視器對(duì)于防止同時(shí)執(zhí)行區(qū)分線程的代碼塊很有用,但是這些構(gòu)造不允許一個(gè)線程向另一個(gè)線程傳達(dá)事件。這需要“同步事件”,它是有兩個(gè)狀態(tài)(終止和非終止)的對(duì)象,可以用來激活和掛起線程。讓線程等待非終止的同步事件可以將線程掛起,將事件狀態(tài)更改為終止可以將線程激活。如果線程試圖等待已經(jīng)終止的事件,則線程將繼續(xù)執(zhí)行,而不會(huì)延遲。

            同步事件有兩種:AutoResetEventManualResetEvent。它們之間唯一的不同在于,無論何時(shí),只要 AutoResetEvent 激活線程,它的狀態(tài)將自動(dòng)從終止變?yōu)榉墙K止。相反,ManualResetEvent 允許它的終止?fàn)顟B(tài)激活任意多個(gè)線程,只有當(dāng)它的 Reset 方法被調(diào)用時(shí)才還原到非終止?fàn)顟B(tài)。

            可以通過調(diào)用一種等待方法,如 WaitOneWaitAnyWaitAll,讓線程等待事件。System.Threading.WaitHandle.WaitOne 使線程一直等待,直到單個(gè)事件變?yōu)榻K止?fàn)顟B(tài);System.Threading.WaitHandle.WaitAny 阻止線程,直到一個(gè)或多個(gè)指示的事件變?yōu)榻K止?fàn)顟B(tài);System.Threading.WaitHandle.WaitAll 阻止線程,直到所有指示的事件都變?yōu)榻K止?fàn)顟B(tài)。當(dāng)調(diào)用事件的 Set 方法時(shí),事件將變?yōu)榻K止?fàn)顟B(tài)。

            在下面的示例中,創(chuàng)建了一個(gè)線程,并由 Main 函數(shù)啟動(dòng)該線程。新線程使用 WaitOne 方法等待一個(gè)事件。在該事件被執(zhí)行 Main 函數(shù)的主線程終止之前,該線程一直處于掛起狀態(tài)。一旦該事件終止,輔助線程將返回。在本示例中,因?yàn)槭录挥糜谝粋€(gè)線程的激活,所以使用 AutoResetEventManualResetEvent 類都可以。

            using System;
            using System.Threading;
            class ThreadingExample
            {
            static AutoResetEvent autoEvent;
            static void DoWork()
            {
            Console.WriteLine("   worker thread started, now waiting on event...");
            autoEvent.WaitOne();
            Console.WriteLine("   worker thread reactivated, now exiting...");
            }
            static void Main()
            {
            autoEvent = new AutoResetEvent(false);
            Console.WriteLine("main thread starting worker thread...");
            Thread t = new Thread(DoWork);
            t.Start();
            Console.WriteLine("main thrad sleeping for 1 second...");
            Thread.Sleep(1000);
            Console.WriteLine("main thread signaling worker thread...");
            autoEvent.Set();
            }
            }

            有關(guān)線程同步事件用法的更多示例,請(qǐng)參見:

            mutex 與監(jiān)視器類似;它防止多個(gè)線程在某一時(shí)間同時(shí)執(zhí)行某個(gè)代碼塊。事實(shí)上,名稱“mutex”是術(shù)語“互相排斥 (mutually exclusive)”的簡(jiǎn)寫形式。然而與監(jiān)視器不同的是,mutex 可以用來使跨進(jìn)程的線程同步。mutex 由 Mutex 類表示。

            當(dāng)用于進(jìn)程間同步時(shí),mutex 稱為“命名 mutex”,因?yàn)樗鼘⒂糜诹硪粋€(gè)應(yīng)用程序,因此它不能通過全局變量或靜態(tài)變量共享。必須給它指定一個(gè)名稱,才能使兩個(gè)應(yīng)用程序訪問同一個(gè) mutex 對(duì)象。

            盡管 mutex 可以用于進(jìn)程內(nèi)的線程同步,但是使用 Monitor 通常更為可取,因?yàn)楸O(jiān)視器是專門為 .NET Framework 而設(shè)計(jì)的,因而它可以更好地利用資源。相比之下,Mutex 類是 Win32 構(gòu)造的包裝。盡管 mutex 比監(jiān)視器更為強(qiáng)大,但是相對(duì)于 Monitor 類,它所需要的互操作轉(zhuǎn)換更消耗計(jì)算資源。有關(guān) mutex 的用法示例,請(qǐng)參見 Mutex

            posted on 2010-01-14 16:58 醒目西西 閱讀(267) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            狠狠色丁香久久综合婷婷| 久久综合色老色| 久久精品国产亚洲Aⅴ香蕉| 久久精品成人免费国产片小草| 无码人妻少妇久久中文字幕| 亚洲色婷婷综合久久| 精品久久国产一区二区三区香蕉| 日韩美女18网站久久精品| 国内精品久久久久影院优| 亚洲精品乱码久久久久久蜜桃| 久久99精品久久久久久久不卡 | 91精品国产91热久久久久福利| 精品久久久久久无码国产| 无码人妻久久一区二区三区免费| 99久久国产综合精品网成人影院 | 人妻无码αv中文字幕久久 | 亚洲精品乱码久久久久久蜜桃图片 | 久久久av波多野一区二区| 色成年激情久久综合| 伊人久久大香线焦AV综合影院| 国产AV影片久久久久久| 久久久婷婷五月亚洲97号色| 久久夜色精品国产噜噜亚洲a| 国产精品成人精品久久久| 久久久久久午夜成人影院| 伊人久久大香线蕉亚洲五月天| 久久久久人妻一区精品果冻| 精品亚洲综合久久中文字幕| 国产午夜福利精品久久2021| 99久久精品免费看国产一区二区三区 | 久久99精品久久久久久不卡| 九九久久99综合一区二区| 久久综合给久久狠狠97色| 性高湖久久久久久久久| 午夜精品久久影院蜜桃| 久久久国产精品| 开心久久婷婷综合中文字幕| 久久精品国产WWW456C0M| 久久精品免费大片国产大片| 久久99国产一区二区三区| 四虎国产永久免费久久|