一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C/C++ 多線程的學習心得總結

C/C++ 多線程的學習心得總結

2020-12-14 14:42C語言教程網 C/C++

本篇文章是對C/C++中多線程的學習心得總結進行了詳細的分析介紹,需要的朋友參考下

個人覺得在學習多線程編程之前最好先了解進程和線程的關系, 然后在學習線程工作方式的過程中動手寫個(我是從抄開始的)多線程的小程序, 會對學習多線程有很大的幫助, 否則只有理論是很抽象的.

在學習多線程編程之前, 必須先知道什么是 線程函數, 線程函數就是另一個線程的入口函數. 默認情況下一個我們所寫的代碼都是只有一個線程的, 而這個線程的入口函數就是main() 函數, 這是系統默認的. 而我們創建的另一個線程也需要一個函數來進入, 這個函數就叫做線程函數.

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

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

復制代碼 代碼如下:


#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;
}


代碼是正確的, 復制粘貼到 Visual C++ 6.0 中, 即可編譯運行. 但是會發現 _beginthreadex(...) 函數未定義的編譯錯誤. 原因是因為我們的visual c++ 6.0 默認的是在單線程模式下編程, 如果需要進行多線程編程, 需要轉換一下編譯器的 '運行期庫' , 方法很簡單:
Project --> Settings --> C/C++ 中 選擇 Category 中的 Code generation , 然后在 Use run-time library 里面選含有Multithread的其中一個就可以了.
這時再編譯, 就可以通過了. 有了這個例子的函數, 現在應該已經入門了吧. 不過除了這個還有很多基礎知識要補上, 推薦通讀幾遍 <windows核心編程(第四版)> 的第6章.
實際上, 在不同的編譯環境下, _beginthreadex(...)函數可能會有不同的名稱, 但是它們都是對 windows函數 CreateThread(...) 的封裝, CreateThread(...)函數用來創建一個新的線程函數, CreateThread(...)函數同樣接受6個參數, 在類似 _beginthreadex(...)的函數中對其做了一些安全的處理, 如堆棧內存的申請等. 雖然可以用CreateThread函數來創建一個新的線程, 但是強烈建議使用 _beginthreadex(...)函數, 對于CreateThread 函數在<windows核心編程(第四版)>第6章中有很好的講解.
當一個線程的任務結束, 要退出時, 有四種方法:
1.線程函數返回(最好使用這種方法);
2.通過調用 _endthreadex()或 ExitThread()函數,線程將自行撤消(最好不要使用這種方法);
3.同一個進程或另一個進程中的線程調用 TerminateThread()函數(應該避免使用這種方法);
4.包含線程的進程終止運行(應該避免使用這種方法).

最好通過其入口函數的返回語句(即:return)來退出線程, 也可以通過調用 C/C++ '運行期庫'函數 _endthreadex()函數來退出, 還有兩種退出的方法, 都是類似的強制退出. 最好使用線程函數的返回語句(return)來退出線程, 只有這樣才能安全的回收該線程的處理器資源和內存資源. 而實際上 _endthreadex()函數和 _beginthreadex(...)函數一樣, 是封裝了windows函數 ExitThread(), 如果一定要強制退出線程, 那么強烈建議調用 _endthreadex() 函數, 這樣能安全的回收系統資源.

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

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

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 四虎永久免费地址在线网站 | 荡女淫春2古装 | 国产日韩一区二区三区 | 夫妻性生活一级黄色片 | 久操久操久操 | 色久久一个亚洲综合网 | 91正在 播放 | 多人群p全肉小说 | 亚洲AV综合99一二三四区 | 久久性生大片免费观看性 | 91视频破解 | 97涩色| 欧美一区二区三区精品国产 | 99九九精品免费视频观看 | 富士av105| 日本在线视 | 免费二级毛片免费完整视频 | 九九九精品视频 | 国产高清视频免费最新在线 | 人人人人看人人人做人人 | 日本乱中文字幕系列在线观看 | 欧美性理论片在线观看片免费 | 大象传媒短视频网站 | 女人把私密部位张开让男人桶 | 女人扒开下面让男人桶爽视频 | 色偷偷伊人 | 波多野结衣在线看 | 亚洲精品中文字幕久久久久久 | 亚洲国产精品综合久久一线 | 母爱成瘾在线观看 | avtt天堂网手机版亚洲 | a片毛片在线免费看 | 91久久福利国产成人精品 | 欧亚精品一区二区三区 | 久久久乱码精品亚洲日韩 | 九九艹| 日本漫画大全之工之口 | 美女的隐私无遮挡撒尿 | 五月色婷婷在线影院 | 国产大秀视频一区二区三区 | 色婷婷精品|