亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

web開發(fā)桌面應(yīng)用程序 delphi開發(fā)安卓步驟


web開發(fā)桌面應(yīng)用程序 delphi開發(fā)安卓步驟

文章插圖
當(dāng)你有兩個或者兩個以上的線程同時運(yùn)行,并且他們共同操作的同一塊數(shù)據(jù)時,我們必須要對其進(jìn)行保護(hù),否則因為時間切片或者一些其他原因造成的延時都會讓你的程序產(chǎn)生錯誤的計算結(jié)果 。即使做兩個線程訪問共享整數(shù)變量這樣簡單的事情也可能導(dǎo)致完全的災(zāi)難
線程之間共享什么數(shù)據(jù)首先,值得確切知道每個進(jìn)程和每個線程存儲的狀態(tài) 。每個線程都有自己的程序計數(shù)器和處理器狀態(tài) 。這意味著線程通過代碼獨立進(jìn)行 。每個線程也有自己的堆棧,因此局部變量本身就是每個線程的本地變量,并且這些變量不存在同步問題 。
程序中的全局?jǐn)?shù)據(jù)可以在線程之間自由共享,因此這些變量可能存在同步問題 。當(dāng)然,如果變量是全局可訪問的,但只有一個線程使用它,則沒有問題 。
Delphi提供了threadvar關(guān)鍵字 。這允許聲明全局變量,其中為每個線程創(chuàng)建變量的副本 。此功能使用不多,因為將這些變量放在TThread類中通常更方便,因此為每個創(chuàng)建的TThread后代創(chuàng)建一個變量實例 。
共享數(shù)據(jù)的原子性為了理解如何使線程協(xié)同工作,有必要理解原子性的概念 。
所謂的原子性是指某一組動作是一個整體,它不可分割,要么一起成功,要么一起失敗 。就好比銀行轉(zhuǎn)賬,轉(zhuǎn)賬這個東西由兩步完成取出、存入,必須兩個都成功才可以算成功,不允許出現(xiàn)一半成功一半失敗
當(dāng)線程執(zhí)行原子操作時,這意味著所有其他線程將操作視為尚未啟動或已完成 。一個線程不可能在“行為”中捕獲另一個線程 。如果線程之間沒有執(zhí)行同步,那么幾乎所有操作都是非原子的 。我們舉一個簡單的例子 ??紤] 這段代碼
vara: integer;begina := a + 1;end;如果兩個單獨的線程使用它來遞增共享變量A,即使是這些微不足道的代碼也會導(dǎo)致問題 。這個單個pascal語句在匯編程序級別分解為三個操作 。
從存儲器讀取A到處理器寄存器 。將1添加到處理器寄存器 。將處理器寄存器的內(nèi)容寫入內(nèi)存中的A.即使在單個處理器機(jī)器上,多個線程執(zhí)行此代碼也可能導(dǎo)致問題 。之所以這樣做是因為調(diào)度操作 。當(dāng)只存在一個處理器時,實際上只有一個線程 一次執(zhí)行,但Win32調(diào)度程序在它們之間以每秒約18次的速度切換 。
調(diào)度程序可以在任何時候停止一個線程運(yùn)行并啟動另一個線程調(diào)度是先發(fā)制人的 。在掛起一個線程并啟動另一個線程之前,操作系統(tǒng)不會等待權(quán)限交換機(jī)可能隨時發(fā)生 。由于切換可以在任何兩個處理器指令之間發(fā)生,因此它可能發(fā)生在函數(shù)中間的臨界點,甚至是執(zhí)行一個特定程序語句的一半 。
讓我們假設(shè)兩個線程正在單處理器機(jī)器(X和Y)上執(zhí)行示例代碼 。在一個很好的情況下,程序可能正在運(yùn)行,并且調(diào)度操作可能會錯過這個臨界點,給出預(yù)期結(jié)果:A增加2 。但是,這絕不是保證,而是盲目的機(jī)會如果共享變量碰巧是一個指針,那結(jié)果可能會讓人崩潰 。
說了一大堆理論,下面以代碼的方式來看看上述的情況會不會出現(xiàn),為了便于觀查我沒有使用視頻中案例,而是采用了控制臺應(yīng)用
usesSystem.SysUtils, System.Classes;typeTWorkThread = class(TThread)protectedprocedure Execute; override;end;var// 定義全局變量,充當(dāng)共享數(shù)據(jù)Num: Integer = 0;{ TWorkThread }procedure TWorkThread.Execute;begin// 循環(huán)的方式自增Numwhile True do begin//為了效果更為明顯加入了延時TThread.Sleep(100);// 當(dāng)Num的值大于10則終止線程if (Num > 10) thenExit;Writeln(Num);Inc(Num);end;end;begin//啟動3個線程TWorkThread.Create(False);TWorkThread.Create(False);TWorkThread.Create(False);Readln;end.執(zhí)行結(jié)果如下


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: