欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++ 多線程的學(xué)習(xí)心得總結(jié)

 更新時(shí)間:2013年05月30日 17:54:01   作者:  
本篇文章是對(duì)C/C++中多線程的學(xué)習(xí)心得總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
個(gè)人覺得在學(xué)習(xí)多線程編程之前最好先了解進(jìn)程和線程的關(guān)系, 然后在學(xué)習(xí)線程工作方式的過程中動(dòng)手寫個(gè)(我是從抄開始的)多線程的小程序, 會(huì)對(duì)學(xué)習(xí)多線程有很大的幫助, 否則只有理論是很抽象的.

在學(xué)習(xí)多線程編程之前, 必須先知道什么是 線程函數(shù), 線程函數(shù)就是另一個(gè)線程的入口函數(shù). 默認(rèn)情況下一個(gè)我們所寫的代碼都是只有一個(gè)線程的, 而這個(gè)線程的入口函數(shù)就是main() 函數(shù), 這是系統(tǒng)默認(rèn)的. 而我們創(chuàng)建的另一個(gè)線程也需要一個(gè)函數(shù)來進(jìn)入, 這個(gè)函數(shù)就叫做線程函數(shù).

在C/C++中, 可以調(diào)用 '運(yùn)行期庫' 函數(shù) _beginthreadex(...), 來創(chuàng)建一個(gè)線程, _beginthreadex(...)函數(shù)接受6個(gè)參數(shù), 其中第3個(gè)參數(shù)要求傳入該線程的入口函數(shù)的地址(即:傳入線程函數(shù)的函數(shù)名+&即可), 其它的每個(gè)參數(shù)的意思可以在msdn或網(wǎng)上查一下, 入門的話其余參數(shù)全部傳0即可.

_beginthreadex(...)函數(shù)返回一個(gè)句柄, 就是新線程的句柄. 對(duì)于傳入的線程函數(shù)是有要求的, 線程函數(shù)必須返回 unsigned __stdcall 類型, 并且接受一個(gè) void* 型參數(shù), 函數(shù)的內(nèi)容就可以自己定了.
先來段多線程的簡單代碼:
復(fù)制代碼 代碼如下:

#include<windows.h>
#include<process.h>
#include<iostream>
using namespace std;
bool stop;
unsigned Counter;
unsigned __stdcall thread(void*)
{
cout <<"In second thread..." <<endl;
while (!stop){
Sleep(200);
cout <<Counter++ <<" " <<flush;
}
//_endthreadex(0);
return 0;
}
int main()
{
HANDLE hThread;
unsigned int threadID;
stop = false;
cout <<"Creating second thread..." <<endl;
// Create the second thread.
hThread = (HANDLE)_beginthreadex(NULL, 0, &thread, NULL, 0, &threadID);
// Wait until second thread terminates. If you comment out the line
// below, Counter will not be correct because the thread has not
// terminated, and Counter most likely has not been incremented to
// 1000000 yet.
//WaitForSingleObject(hThread, INFINITE);
system("pause");
stop = true;
//cin >>stop;
cout <<"Counter is-> " <<Counter <<endl;
// Destroy the thread object.
CloseHandle(hThread);
system("pause");
return 0;
}

代碼是正確的, 復(fù)制粘貼到 Visual C++ 6.0 中, 即可編譯運(yùn)行. 但是會(huì)發(fā)現(xiàn) _beginthreadex(...) 函數(shù)未定義的編譯錯(cuò)誤. 原因是因?yàn)槲覀兊膙isual c++ 6.0 默認(rèn)的是在單線程模式下編程, 如果需要進(jìn)行多線程編程, 需要轉(zhuǎn)換一下編譯器的 '運(yùn)行期庫' , 方法很簡單:
Project --> Settings --> C/C++ 中 選擇 Category 中的 Code generation , 然后在 Use run-time library 里面選含有Multithread的其中一個(gè)就可以了.
這時(shí)再編譯, 就可以通過了. 有了這個(gè)例子的函數(shù), 現(xiàn)在應(yīng)該已經(jīng)入門了吧. 不過除了這個(gè)還有很多基礎(chǔ)知識(shí)要補(bǔ)上, 推薦通讀幾遍 <windows核心編程(第四版)> 的第6章.
實(shí)際上, 在不同的編譯環(huán)境下, _beginthreadex(...)函數(shù)可能會(huì)有不同的名稱, 但是它們都是對(duì) windows函數(shù) CreateThread(...) 的封裝, CreateThread(...)函數(shù)用來創(chuàng)建一個(gè)新的線程函數(shù), CreateThread(...)函數(shù)同樣接受6個(gè)參數(shù), 在類似 _beginthreadex(...)的函數(shù)中對(duì)其做了一些安全的處理, 如堆棧內(nèi)存的申請(qǐng)等. 雖然可以用CreateThread函數(shù)來創(chuàng)建一個(gè)新的線程, 但是強(qiáng)烈建議使用 _beginthreadex(...)函數(shù), 對(duì)于CreateThread 函數(shù)在<windows核心編程(第四版)>第6章中有很好的講解.
當(dāng)一個(gè)線程的任務(wù)結(jié)束, 要退出時(shí), 有四種方法:
1.線程函數(shù)返回(最好使用這種方法);
2.通過調(diào)用 _endthreadex()或 ExitThread()函數(shù),線程將自行撤消(最好不要使用這種方法);
3.同一個(gè)進(jìn)程或另一個(gè)進(jìn)程中的線程調(diào)用 TerminateThread()函數(shù)(應(yīng)該避免使用這種方法);
4.包含線程的進(jìn)程終止運(yùn)行(應(yīng)該避免使用這種方法).
最好通過其入口函數(shù)的返回語句(即:return)來退出線程, 也可以通過調(diào)用 C/C++ '運(yùn)行期庫'函數(shù) _endthreadex()函數(shù)來退出, 還有兩種退出的方法, 都是類似的強(qiáng)制退出. 最好使用線程函數(shù)的返回語句(return)來退出線程, 只有這樣才能安全的回收該線程的處理器資源和內(nèi)存資源. 而實(shí)際上 _endthreadex()函數(shù)和 _beginthreadex(...)函數(shù)一樣, 是封裝了windows函數(shù) ExitThread(), 如果一定要強(qiáng)制退出線程, 那么強(qiáng)烈建議調(diào)用 _endthreadex() 函數(shù), 這樣能安全的回收系統(tǒng)資源.

具體的 _beginthreadex(...)函數(shù) 和 _endthreadex()函數(shù)在<windows核心編程(第四版)>第6章中有很好的剖析. 同時(shí)還有兩個(gè) _beginthread(...) 和 _endthread() 運(yùn)行期庫函數(shù), 也有講解.
windows還提供了一些庫函數(shù)用來獲得當(dāng)前進(jìn)程或者線程的句柄, 如 HANDLE GetCurrentProcess() 函數(shù)返回當(dāng)前進(jìn)程的句柄, HANDLE GetCurrentThread() 函數(shù)返回當(dāng)前線程的句柄, 但是需要注意的是, 這些句柄都是 '偽句柄' , 即: 只在本進(jìn)程和本線程內(nèi)可用, 不可傳出取用.

如果需要在外部使用其它線程或進(jìn)程的句柄, 則可以用 DuplicateHandle(...) 函數(shù)獲得其它進(jìn)程或者線程的 '實(shí)句柄' , 該函數(shù)接受7個(gè)參數(shù), 具體的用法可以查閱一下msdn和網(wǎng)絡(luò). 需要注意的是, 在使用完 由DuplicateHandle(...) 函數(shù)獲得的句柄后, 需要使用 CloseHandle() 函數(shù)來關(guān)閉該句柄.

相關(guān)文章

  • C++非遞歸隊(duì)列實(shí)現(xiàn)二叉樹的廣度優(yōu)先遍歷

    C++非遞歸隊(duì)列實(shí)現(xiàn)二叉樹的廣度優(yōu)先遍歷

    這篇文章主要介紹了C++非遞歸隊(duì)列實(shí)現(xiàn)二叉樹的廣度優(yōu)先遍歷,實(shí)例分析了遍歷二叉樹相關(guān)算法技巧,并附帶了兩個(gè)相關(guān)算法實(shí)例,需要的朋友可以參考下
    2015-07-07
  • VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法

    這篇文章主要介紹了VC外部符號(hào)錯(cuò)誤_main,_WinMain@16,__beginthreadex解決方法,實(shí)例分析了比較典型的錯(cuò)誤及對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2015-05-05
  • C語言編程數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解小白篇

    C語言編程數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解小白篇

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),非常適合初學(xué)數(shù)據(jù)結(jié)構(gòu)的小白,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • 淺談防不勝防的unsigned int的運(yùn)算

    淺談防不勝防的unsigned int的運(yùn)算

    下面小編就為大家?guī)硪黄獪\談防不勝防的unsigned int的運(yùn)算。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++中實(shí)現(xiàn)子進(jìn)程執(zhí)行和管道通信詳解

    C++中實(shí)現(xiàn)子進(jìn)程執(zhí)行和管道通信詳解

    在這篇博客中,我們將深入探索如何在 C++ 程序中實(shí)現(xiàn)子進(jìn)程的創(chuàng)建與執(zhí)行,以及父子進(jìn)程間的管道通信,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 在iOS中給視頻添加濾鏡的方法示例

    在iOS中給視頻添加濾鏡的方法示例

    這篇文章主要介紹了在iOS中給視頻添加濾鏡的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語言修煉之路初識(shí)分支句?循環(huán)助本心下篇

    C語言修煉之路初識(shí)分支句?循環(huán)助本心下篇

    現(xiàn)實(shí)生活中我們經(jīng)常需要根據(jù)不同的條件做出不同的選擇。程序設(shè)計(jì)中也需要根據(jù)條件來選擇不同的程序進(jìn)行處理,這稱之為分支結(jié)構(gòu),當(dāng)條件表達(dá)式不存在時(shí),它被假設(shè)為真。您也可以設(shè)置一個(gè)初始值和增量表達(dá)式,一般情況下,C?程序員偏向于使用?for(;;)?結(jié)構(gòu)來表示一個(gè)無限循環(huán)
    2022-03-03
  • 利用C++實(shí)現(xiàn)簡易的.ini配置文件解析器

    利用C++實(shí)現(xiàn)簡易的.ini配置文件解析器

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個(gè)簡易的.ini配置文件解析器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語言如何輸出中文

    C語言如何輸出中文

    這篇文章主要介紹了C語言如何輸出中文問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Qt利用DOM類實(shí)現(xiàn)讀取xml文件

    Qt利用DOM類實(shí)現(xiàn)讀取xml文件

    Dom(Document Object Model,即文檔對(duì)象模型)能把XML文檔轉(zhuǎn)換成應(yīng)用程序可遍歷的樹形結(jié)構(gòu),這樣便可以隨機(jī)訪問其中的節(jié)點(diǎn)。本文將詳細(xì)講講實(shí)現(xiàn)的方法,需要的可以參考一下
    2022-06-06

最新評(píng)論