亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 新建 文本文檔 (2).txt

?? 計算機操作系統的c++版本
?? TXT
字號:

  摘 要:本文簡單介紹了Windows環境下進行多線程編程的意義,重點討論了C++Builder環境下開發多線程應用程序這一問題,并通過實現生產者-消費者問題,幫我們更好地理解同步概念及其實現方法。

  關鍵詞:多線程;同步;生產者-消費者;C++Builder 

  線程之可行性

  在很多情況下,可能需要為程序創建線程。這里給出其中一些可能性:

  (1)如果創建的是一個多文檔接口(Multiple Document Interface,MDI)程序,那么為每個窗口分配一個線程就顯得十分重要了,例如,對于一個通過多個Modem同時連接到多個主機的MDI通信程序而言,如果每個窗口都有它自己的線程來和一個主機通信,那么整個事情就簡化很多。

  (2)如果使用的是一臺有多個處理器的機器,并希望充分利用所有可能獲得的CPU資源,那么就需要將應用程序分解成多個線程。Windows2000中CPU的劃分單位為線程。因此,如果程序只包含一個線程,那么,默認環境下該程序只能使用其中一個CPU。但是,如果將此程序劃分為多個線程,那么Windows2000就可以在不同的CPU上運行各個線程。

  (3)在后臺運行的某些任務的同時,要求用戶還可以繼續使用應用程序進行工作。利用線程很容易實現這點。例如:可以將一些冗長的重算、頁面格式化操作、文件的讀寫等活動都放在單獨的線程中,使其在后臺運行,而不會對用戶造成影響。

  同步

  撰寫多線程程序的一個最具挑戰性的問題就是:如何讓一個線程和另一個線程合作。這引出了一個非常重要的問題:同步。所謂同步是指進程、線程間相互通信時避免破壞各自數據的能力。Windows環境下的同步問題是由Win32系統的CPU時間片分配方式引起的。雖然在某一時刻,只有一個線程占用CPU(單CPU)時間,但是無法知道在什么時候,在什么地方線程被打斷,這樣如何保證線程之間不破壞彼此的數據就顯得格外重要。同步問題是如此重要,也相當有趣,因而吸引了不少學者對他進行研究,由此產成了一系列經典的進程同步問題,其中較有代表性的是"生產者-消費者問題"、"讀者-寫者問題""哲學家進餐問題"等。在此,本文簡要討論了C++Builder平臺下如何利用多線程編程技術實現"生產者-消費者"問題,幫助我們更好得理解同步概念及其實現方法。

  生產者-消費者問題

  生產者-消費者問題是一個著名的進程同步問題。它描述的是:有一群生產者進程在生產消息,并將此消息提供給消費者進程去消費。為使生產者進程和消費者進程能并發進行,在他們之間設置了一個具有N個緩沖區的緩沖池,生產者進程可以將它所生產的消息放入一個緩沖區中,消費者進程可以從一個緩沖區中取得一個消息消費。盡管所有的生產者進程和消費者進程都是以異步方式進行的,但他們之間必須保持同步,即不允許消費者進程到一個空的緩沖區中去取消息,也不允許生產者進程向一個已裝滿消息且尚未被取走消息的緩沖區中投放消息。

  C++Builder多線程應用程序編程基礎

  1、使用C++Builder提供的TThread類

  VCL類庫提供了用于線程編程的TThread類。在TThread類中封裝了Windows中關于線程機制的WindowsAPI。對于大多數的應用程序來說,可在應用程序中使用線程對象來表示執行線程。線程對象通過封裝使用線程所需的內容,簡化了多線程應用程序的編寫。注意,線程對象不允許控制線程堆棧的大小或其安全屬性。若需要控制這些,必須使用WindowsAPI的Create Thread()或Begin Thread()函數。
TThread類有以下一些屬性和方法:

  1) 屬性:

  ·Priority:優先級屬性。可以設置線程的優先級。

  ·Return Value:返回值屬性。當線程介紹時返回給其他線程一個數值。

  ·Suspended:掛起屬性。可以判斷線程是否被掛起。

  ·Terminated:結束屬性。用來標志是否應該結束線程。

  ·ThreadID:標識號屬性。在整個系統中線程的標識號。使用Windows API函數時該屬性非常有用。

  2) 方法:

  ·Do Terminate:產生一個On Terminate事件,但是不結束線程的執行。

  ·Resume:喚醒一個線程繼續執行。

  ·Suspend:掛起一個線程,要與Resume過程成對使用。

  ·Synchronize:由主VCL線程調用的一個同步過程。

  ·Terminate:將Terminate屬性設置為True,中止線程的執行。

  ·Wait For:等待線程的中止并返回Return Value屬性的數值。

  2、協調線程

  在編寫線程執行時運行的代碼時,必須考慮到可能同步執行的其他線程的行為。特別注意,避免兩個線程試圖同時使用相同的全局對象或變量。另外,一個線程中的代碼會依賴其他線程執行任務的結果。

  1) 避免同時訪問

  為避免在訪問全局對象或變量時與其他線程發生沖突,可能需要暫停其他線程的執行,直到該線程代碼完成操作。

  (1)鎖定對象。一些對象內置了鎖定功能,以防止其他線程使用該對象的實例。例如,畫布對象(TCanvas及其派生類)有一種Lock()函數可以防止其他線程訪問畫布,直到調用Unlock()函數。顯然,這種方法只對部分類有效。

  (2)使用重要區段。若對象沒有提供內置的鎖定功能,可使用重要區段。重要區段像門一樣,每次只允許一個線程進入,要使用重要區段,需創建TCriticalSection的全局實例。TCriticalSection有兩個函數:Acquire()(阻止其他線程執行該區域)及Release()(取消對其他線程的阻止)。

  (3)使用多重讀、獨占寫的同步器。當使用重要區段來保護全局內存時,每次只有一個線程可以使用該內存。這種保護可能會超出了需要,特別是有一個經常讀但很少寫的對象或變量時更是如此。多個線程同時讀相同內存但沒有線程寫內存是沒有危險的。當有一些經常被讀,但是很少寫的全局變量時,可用TMultiReadExclusiveWriteSynchronizer對象保護它。這個對象和重要區段一樣,但它允許多個線程同時讀,只要沒有線程寫即可。每個需要讀內存的線程首先要調用Begin Read()函數(確保當前無其他線程寫內存),線程完成對保護內存讀操作后,要調用End Read()函數。任何線程需要寫保護內存必須調用Begin Write()函數(確保當前無其他線程讀或寫內存),完成對保護內存寫操作后,調用End Write()函數。

  (4)使用Synchronize函數:Void __fast call Synchronize (TThreadMethod &Method);

  其中參數Method為一個不帶參數的過程名。在這個不帶參數的過程中是一些訪問VCL的代碼。我們可以在Execute過程中調用Synchronize過程來避免對VCL的并發訪問。程序運行期間的具體過程實際上是由Synchronize過程來通知主線程,然后主線程在適當的時機來執行Synchronize過程的參數列表中的那個不帶參數的過程。在多個線程的情況下,主線程將Synchronize過程發過來的通知放到消息隊列中,然后逐個地響應這些消息。通過這種機制Synchronize實現了線程之間地同步。

  2) 等待其他線程

  若線程必須等待另一線程完成某項任務,可讓線程臨時中斷執行。然后,要么等待另一線程完全執行結束,要么等待另一線程通知完成了該任務。

  (1)等待線程執行結束

  要等待另一線程執行結束,使用它地Wait For()函數。Wait For函數直到那個線程終止才返回,終止的方式要么完成了其Execute()函數,要么由于一個異常。

  (2)等待任務完成。有時,只需要等待線程完成一些操作而不是等待線程執行結束。為此,可使用一個事件對象。事件對象(TEvent)應具有全局范圍以便他們能夠為所有線程可見。當一個線程完成一個被其他線程依賴的操作時,調用TEvent::Set Event()函數。Set Event發出一個信號,以便其他線程可以檢查并得知操作完成。要關掉信號,則使用Reset Event()函數。

  例如,當必須等待若干線程完成其執行而不是單個線程時。因為不知道哪個線程最后完成,也就不能對某個線程使用Wait For()函數。此時,可通過調用Set Event以在線程結束時累加計數值并在最后一個線程結束時發出信號以指示所有線程結束。

  多線程應用程序編程實例

  下面是一個實現"生產者-消費者問題"的多線程應用實例。在此例中,我們按上面介紹的方法構造了兩個TThread的子類TProducerThread(生產者線程)和TCustomerThread(消費者線程),生產和消費的商品僅僅是一個整數。在協調生產和消費的過程中,重要區段(TCriticalSection)和事件(TEvent)得到了應用。生產者通過TEvent類的對象Begin Consume來通知消費者開始消費,而消費者通過TEent類的對象Begin Produce通知生產者開始生產。程序中共有兩個生產者,一個消費者。在兩個生產者之間,通過TCriticalSection類的對象同步。其運行界面如圖1所示。


圖1 程序運行效果  

  主要源程序如下所示:

  生產者線程:


Void __fast call TProducerThread:: Execute ()
{
  //---- Place thread code here ----
  Int i = 0;
  Int j;
  while(i<100) //每個生產者線程生產100個商品
  {
   Sleep(1000);//延遲,為清楚得顯示執行效果
   if(Form1->buffer_size > 0)//緩沖池不空,通知消費者消費
   {
    Form1->Begin Consumer->Set Event ();
  }
  Form1->Produce Guard->Acquire ();
  i++;
  StrResult = IntToStr (i);
  J = Form1->buffer_size;
  Form1->Product [j] = i;
  Form1->buffer_size++;
  Synchronize(Show Result);//刷新界面,顯示最新生產-消費狀況
  Form1->Begin Consumer->Set Event();//通知消費者消費
  if(Form1->buffer_size == 5)//緩沖池滿,掛起生產者線程,直到通知再生產
  {
   Form1->Begin Produce->Wait For (INFINITE);
  }
  Sleep (1000);
  Form1->Produce Guard->Release ();
}
While (Form1->buffer_size > 0)
{
  Form1->Begin Consumer->Set Event ();
}
}

   消費者線程:


Void __fast call TConsumerThread::Execute()
{
  //---- Place thread code here ----
  Int j;
  For (int i = 0;i < 200;i++)
  {
   Sleep(100); //延遲,為清楚得顯示執行效果
   Form1->Begin Consumer->Wait For(INFINITE);//掛起消費者線程,直到通知再消費
   J = Form1->buffer_size - 1;
   StrResult = IntToStr (Form1->Product [j]);
   Form1->buffer_size--;
   Synchronize(Show Result); //刷新界面,顯示最新生產-消費狀況
   if(Form1->buffer_size == 4)//緩沖池不再full,喚醒由于緩沖池full而掛起的生產者線程
   {
    Form1->Begin Produce->Set Event ();
   }
   Sleep (100);
  }
}

  結論

   本文討論了多線程編程及其可行性,說明了在Windows環境下進行多線程編程的意義,并重點討論了C++Builder平臺下如何開發多線程應用程序這一問題,通過實現"生產者-消費者問題"這一著名的進程同步問題,比較清晰地反映了在Windows環境下進行多線程編程技術及其實現的作用和效果。

 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产精品一区二区三区| 国产精品一二三四区| 91麻豆精品国产91久久久 | 99国内精品久久| 亚洲成av人片一区二区梦乃| 日韩欧美精品在线| 在线视频欧美区| 播五月开心婷婷综合| 日本欧美肥老太交大片| 国产精品福利一区| 欧美一级片免费看| 91福利在线观看| 99久久亚洲一区二区三区青草| 麻豆91精品91久久久的内涵| 亚洲乱码中文字幕综合| 国产精品视频免费| 久久亚洲捆绑美女| 欧美变态tickle挠乳网站| 在线观看日韩国产| 欧美亚一区二区| 在线免费av一区| 欧美午夜不卡在线观看免费| 91社区在线播放| 欧洲另类一二三四区| 色悠悠久久综合| 欧美性受极品xxxx喷水| 色综合中文字幕| 欧美日韩国产美| 欧美sm美女调教| 久久精品欧美日韩| 国产精品久久影院| 自拍偷在线精品自拍偷无码专区 | 99国产欧美另类久久久精品| 99精品视频在线观看免费| 一本色道久久综合亚洲精品按摩| a4yy欧美一区二区三区| 91女厕偷拍女厕偷拍高清| 色欧美片视频在线观看在线视频| 99久久99久久免费精品蜜臀| 在线播放中文字幕一区| 国产人成一区二区三区影院| 亚洲自拍与偷拍| 国产精品一区二区在线看| 91亚洲精品久久久蜜桃网站| 欧美高清视频不卡网| 久久久天堂av| 首页欧美精品中文字幕| 成人免费高清在线| 精品1区2区3区| 日本一区二区三区电影| 蜜桃精品视频在线观看| 在线观看网站黄不卡| 国产精品久久久久久亚洲毛片| 亚洲国产精品一区二区久久恐怖片 | 日本乱人伦aⅴ精品| 精品国产三级电影在线观看| 自拍偷拍国产精品| 成人久久18免费网站麻豆 | 日本一区二区三区电影| 蜜臀91精品一区二区三区| 欧美精品久久久久久久久老牛影院| 国产欧美一区二区精品婷婷| 国产原创一区二区| 日韩欧美一级在线播放| 国产91精品露脸国语对白| 久久久激情视频| eeuss国产一区二区三区| 欧美国产国产综合| 成人午夜短视频| 国产精品久久久一本精品| 99久久免费精品高清特色大片| 国产亚洲综合色| 欧美视频一区二区三区四区 | 欧美欧美欧美欧美首页| 国产原创一区二区| 一区二区高清免费观看影视大全 | 亚洲欧美成aⅴ人在线观看| 91蜜桃传媒精品久久久一区二区 | 亚洲mv在线观看| 欧美男人的天堂一二区| 九九视频精品免费| 国产精品久久久久久久久晋中 | 97精品久久久久中文字幕| 亚洲福利视频一区二区| 久久亚洲二区三区| 在线观看亚洲专区| 国产成人无遮挡在线视频| 亚洲色图20p| ww久久中文字幕| 欧美欧美欧美欧美| 91丨九色porny丨蝌蚪| 精彩视频一区二区三区| 亚洲一区二区精品3399| 国产精品久久久久影院老司| 欧美日韩三级视频| 成人一级视频在线观看| 青青草视频一区| 亚洲午夜精品久久久久久久久| 国产日本一区二区| 久久久99久久精品欧美| 欧美一区二区三区四区视频| 99久久精品国产观看| 国产精品一区二区视频| 精品一区二区三区视频在线观看| 亚洲精品高清视频在线观看| 中文字幕一区av| 亚洲欧美自拍偷拍| 国产精品久久久久久妇女6080| 精品国产乱码久久久久久老虎 | 色欧美片视频在线观看| www.激情成人| 色综合视频一区二区三区高清| 丰满放荡岳乱妇91ww| 91亚洲精品久久久蜜桃| 色狠狠色噜噜噜综合网| 91久久一区二区| 欧美午夜电影网| 精品国内二区三区| 久久久亚洲高清| 中文字幕精品一区| 亚洲精品欧美在线| 强制捆绑调教一区二区| 国产在线精品一区二区夜色| 成人性色生活片免费看爆迷你毛片| 成人午夜免费视频| 欧美少妇xxx| 久久先锋资源网| 悠悠色在线精品| 麻豆精品在线看| 欧美在线观看一二区| 91精品久久久久久久99蜜桃| 中文欧美字幕免费| 亚洲午夜久久久久久久久电影网 | 成人午夜视频福利| 3d动漫精品啪啪一区二区竹菊| 久久美女高清视频| 五月激情综合婷婷| 99精品久久只有精品| 91精品国产综合久久精品app| 国产精品少妇自拍| 麻豆精品视频在线观看视频| 一本一道波多野结衣一区二区| 精品国产自在久精品国产| 亚洲bdsm女犯bdsm网站| 成人高清伦理免费影院在线观看| 精品欧美一区二区久久| 亚洲成av人**亚洲成av**| 在线视频亚洲一区| 亚洲精品日产精品乱码不卡| 亚洲乱码日产精品bd| 成人的网站免费观看| 中文字幕在线观看不卡视频| 成人性生交大合| 国产精品久久精品日日| 丁香六月综合激情| 国产精品美女一区二区| 99r精品视频| 亚洲综合视频网| 91精品一区二区三区在线观看| 午夜精品123| 久久久91精品国产一区二区三区| 国产成人一级电影| 国产精品天干天干在观线| 91欧美一区二区| 亚洲777理论| 中文字幕国产一区| 91传媒视频在线播放| 裸体健美xxxx欧美裸体表演| 久久综合九色综合97婷婷 | 国产福利一区二区| 亚洲一区二区三区自拍| 日韩免费在线观看| av成人动漫在线观看| 美女久久久精品| 亚洲欧美日韩久久| 久久亚洲二区三区| 91精品久久久久久蜜臀| youjizz国产精品| 国产综合久久久久影院| 一区二区三区在线高清| 久久综合久久久久88| 欧美在线视频不卡| 白白色 亚洲乱淫| 国产麻豆9l精品三级站| 秋霞影院一区二区| 久久嫩草精品久久久久| 久久66热偷产精品| 精品国产乱码91久久久久久网站| 国内精品写真在线观看| 国产精品1区2区3区| 91色综合久久久久婷婷| 日韩一区二区三区观看| 亚洲国产激情av| 蜜桃在线一区二区三区| 91在线小视频| 欧美丰满少妇xxxxx高潮对白| 欧美草草影院在线视频| 欧美高清一级片在线观看| 亚洲一区二区四区蜜桃| 精品在线一区二区三区|