程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++多線程技術windows常用方法

C++多線程技術windows常用方法

編輯:C++入門知識

隨著計算機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-金雞獨立的博客。再見!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved