漫談C Builder多執行緒程式設計技術

2021-04-26 07:15:30 字數 2334 閱讀 9354

在很多情況下,可能需要為程式建立執行緒。這裡給出其中一些可能性:

(1)如果建立的是乙個多文件介面(multiple document inte***ce,mdi)程式,那麼為每個視窗分配乙個執行緒就顯得十分重要了,例如,對於乙個通過多個modem同時連線到多個主機的mdi通訊程式而言,如果每個視窗都有它自己的執行緒來和乙個主機通訊,那麼整個事情就簡化很多。

(2)如果使用的是一台有多個處理器的機器,並希望充分利用所有可能獲得的cpu資源,那麼就需要將應用程式分解成多個執行緒。windows2000中cpu的劃分單位為執行緒。因此,如果程式只包含乙個執行緒,那麼,預設環境下該程式只能使用其中乙個cpu。但是,如果將此程式劃分為多個執行緒,那麼windows2000就可以在不同的cpu上執行各個執行緒。

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

同步

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

生產者-消費者問題

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

c++builder多執行緒應用程式程式設計基礎

下面是乙個實現"生產者-消費者問題"的多執行緒應用例項。在此例中,我們按上面介紹的方法構造了兩個tthread的子類tproducerthread(生產者執行緒)和tcustomerthread(消費者執行緒),生產和消費的商品僅僅是乙個整數。在協調生產和消費的過程中,重要區段(tcriticalsection)和事件(tevent)得到了應用。生產者通過tevent類的物件begin consume來通知消費者開始消費,而消費者通過teent類的物件begin produce通知生產者開始生產。程式中共有兩個生產者,乙個消費者。在兩個生產者之間,通過tcriticalsection類的物件同步。其執行介面如圖1所示。

圖1 程式執行效果

主要源程式如下所示:

生產者執行緒:

void __fast call tproducerthread:: execute ()

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)//緩衝池滿,掛起生產者執行緒,直到通知再生產

sleep (1000);

form1->produce guard->release ();

}while (form1->buffer_size > 0)}

消費者執行緒:

void __fast call tconsumerthread::execute()

sleep (100);}}

結論

本文討論了多執行緒程式設計及其可行性,說明了在windows環境下進行多執行緒程式設計的意義,並重點討論了c++builder平台下如何開發多執行緒應用程式這一問題,通過實現"生產者-消費者問題"這一著名的程序同步問題,比較清晰地反映了在windows環境下進行多執行緒程式設計技術及其實現的作用和效果。

漫談多執行緒 一

一.多執行緒這裡的東西個人覺得整體的設計靈感來自於生活,多執行緒的目的是為了提高程式執行的效率,對映到我們生活中,是能找到異曲同工之妙的.二.多執行緒提的比較的多的概念可能就是同步和非同步了,什麼是同步,簡單說就是前面的任務沒完成的話不執行後面的任務,非同步就是前面的任務就算沒執行完,後面的任務也開...

多執行緒程式設計

1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...

多執行緒程式設計

如何編寫執行緒安全的dll 在我的工作中經常會編寫dll,這些dll有個共同的特點就是都有乙個初始化函式,乙個資源釋放函式,其他幾個函式都是核心功能函式。而且這些dll有時會被多個程序同時呼叫,這就牽扯到多程序的多執行緒呼叫dll的問題。有點繞口,以下我根據我實踐中遇到的問題,分四種情況分享一下我解...