隨著計算機CPU計算能力快速提高,計算機的處理性能和並行性能力也大大提升。那麼,一味使用運行時標准庫的C++語言也應該開始支持多線程技術。今天,我為大家帶來了C++在windows平台下的常用多線程方法。
首先我先說一下線程的狀態。線程有掛起狀態、執行狀態、阻塞狀態和等待狀態,下面分別介紹:掛起狀態是說線程創建後並沒有直接執行或是調用函數掛起了線程。被掛起了的線程沒有執行的能力,只有調用啟動函數了之後才能執行。而執行狀態是指在線程的時間片內,擁有CPU資源的時候,這是,線程便開始執行。阻塞狀態是由於進行大量輸入輸出操作或發生執行錯誤時,線程失去執行狀態,只有等待問題解除之後,線程才能進入等待狀態。等待狀態是指線程啟動或時間片搶占失敗是等待其他線程執行,在此期間,線程隨時可能被執行。那麼,請大家看一個流程圖:
下面,我們來介紹如何創建線程,我不會向一般的教程那樣上來先羅列一大堆MSDN上的函數原型,把大家弄得糊裡糊塗了再講,我首先先把函數原型翻譯成中文好了:
下面我就重點說一下:
還有我要說一下HANDLE這個類型,它其實是一個指針,也是CreateThread的返回值。也就是一個線程句柄,用於標示一個線程。當然,其他對於線程的操作都需要使用這個指針。如果你沒有學過指針引用,還是好好復習一下*和&吧。對了還有->。我為什麼要介紹HANDLE呢?因為我將要說一下倒數第二個參數——運行參數。這是實際上是一個bool類型的值,用於標示是否在創建線程後立刻執行,如果為true,也就是0,那麼就會立刻執行,否則將會掛起,等待啟動。那麼,我們用以下方法啟動線程:
DWORD ResumeThread(HANDLE hThread);
如果調用這個函數,將會啟動HANDLE參數所代表的線程。下面我們看看如何掛起線程,使線程進入掛起狀態:
DWORD SuspendThread(HANDLE hThread);
掛起線程後可以進行釋放以便停止線程:
delete HANDLE
掛起線程也可能為了等待重要操作然後再執行線程,以下函數將解除線程掛起狀態,使線程進入等待狀態:
DWORD ResumeThread(HANDLE hThread);
實際上,停止一個線程還有一種方法——強行停止,但是已經不建議使用,現在都是使用掛起+delete的方法,因為使用強行停止會有很多的安全問題,但也是一個功能,所以在這裡為大家介紹一下:
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
那麼,關於多線程的基本C++API就講完了,那麼我要說一個關鍵字——volatile。它代表“易變的”,編譯器不會優化使用這個關鍵字生命的全局變量,保證此變量完全“聽你的話”。那麼,就可以實現簡單的線程間通訊。接著,來寫一個比較簡單的例程,本來是Java1234的多線程例程,現在被我改成了C++版本。請看:
#include <iostream><windows.h> ThreadUser(){ cout<<<<( i=;i<;++i){ cout<<<<i<<<<; Sleep(); <<<<<<<< CreateThread(,,(LPTHREAD_START_ROUTINE)ThreadUser,,,); ResumeThread(HANDLE); ( i=;i<;++i){ cout<<<<i<<<<; Sleep(); ); delete h; cout<<<<
好了,我們的多線程就先講到這裡,下次再見。
順便說一下,我們的老朋友windows XP今天退役了,大家默哀一下吧……
歡迎繼續關注BKMMSC-金雞獨立的博客。再見!