程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++ 多線程的進修心得總結

C/C++ 多線程的進修心得總結

編輯:關於C++

C/C++ 多線程的進修心得總結。本站提示廣大學習愛好者:(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() 函數來封閉該句柄.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved