摘 要:本文簡單介紹了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平台下如何利用多線程編程技術實現"生產者-消費者"問題,協助我們更好得理解同步概念及其實現方法。