最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解_beginthreadex()創(chuàng)建線程

 更新時(shí)間:2022年01月02日 09:52:09   作者:學(xué)步園  
這篇文章主要介紹了詳解_beginthreadex()創(chuàng)建線程,使用_beginthreadex(),需要的頭文件支持#include <process.h> 下面我們就來看看具體的實(shí)現(xiàn)吧

一、使用_beginthreadex()             

需要的頭文件支持#include         // for _beginthread()
需要的設(shè)置:ProjectàSetting-->C/C++-->User run-time library 選擇Debug Multithreaded 或者Multithreaded。即使用: MTMTD。

代碼如下:     
 

#include <stdio.h>
#include <string> ? ? ? ? ? ? // for STL string class
#include <windows.h> ? ? ? ? ?// for HANDLE
#include <process.h> ? ? ? ? ?// for _beginthread()
using namespace std;

class ThreadX
{
private:
? int loopStart;
? int loopEnd;
? int dispFrequency;
public:
? string threadName;

? ThreadX( int startValue, int endValue, int frequency )
? {
?? ?loopStart = startValue;
?? ?loopEnd = endValue;
?? ?dispFrequency = frequency;
? }

? static unsigned __stdcall ThreadStaticEntryPoint(void * pThis)
? {
?? ? ?ThreadX * pthX = (ThreadX*)pThis; ? // the tricky cast
?? ? ?pthX->ThreadEntryPoint(); ? ? ? ? ? // now call the true entry-point-function
?? ? ?return 1;?? ??? ??? ??? ??? ??? ? ? ? ?// the thread exit code
? }

? void ThreadEntryPoint()
? {
?? ?for (int i = loopStart; i <= loopEnd; ++i)
?? ?{
?? ? ?if (i % dispFrequency == 0)
?? ? ?{
?? ??? ? ?printf( "%s: i = %d\n", threadName.c_str(), i );
?? ? ?}
?? ?}
?? ?printf( "%s thread terminating\n", threadName.c_str() );
? }
};


int main()
{
? ? ThreadX * o1 = new ThreadX( 0, 1, 2000 );

? ? HANDLE ? hth1;
? ? unsigned ?uiThread1ID;

? ? hth1 = (HANDLE)_beginthreadex( NULL, ? ? ? ? // security
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0, ? ? ? ? ? ?// stack size
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ThreadX::ThreadStaticEntryPoint,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?o1, ? ? ? ? ? // arg list
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CREATE_SUSPENDED, ?// so we can later call ResumeThread()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&uiThread1ID );

? ? if ( hth1 == 0 )
? ? ? ? printf("Failed to create thread 1\n");

? ? DWORD ? dwExitCode;
? ? GetExitCodeThread( hth1, &dwExitCode ); ?// should be STILL_ACTIVE = 0x00000103 = 259
? ? printf( "initial thread 1 exit code = %u\n", dwExitCode );

? ? o1->threadName = "t1";

? ? ThreadX * o2 = new ThreadX( -100000, 0, 2000 );

? ? HANDLE ? hth2;
? ? unsigned ?uiThread2ID;

? ? hth2 = (HANDLE)_beginthreadex( NULL, ? ? ? ? // security
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0, ? ? ? ? ? ?// stack size
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ThreadX::ThreadStaticEntryPoint,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?o2, ? ? ? ? ? // arg list
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CREATE_SUSPENDED, ?// so we can later call ResumeThread()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&uiThread2ID );

? ? if ( hth2 == 0 )
? ? ? ? printf("Failed to create thread 2\n");

? ? GetExitCodeThread( hth2, &dwExitCode ); ?// should be STILL_ACTIVE = 0x00000103 = 259
? ? printf( "initial thread 2 exit code = %u\n", dwExitCode );

? ? o2->threadName = "t2";

? ? ResumeThread( hth1 ); ? // serves the purpose of Jaeschke's t1->Start()
? ? ResumeThread( hth2 ); ??

? ? WaitForSingleObject( hth1, INFINITE );
? ? WaitForSingleObject( hth2, INFINITE );

? ? GetExitCodeThread( hth1, &dwExitCode );
? ? printf( "thread 1 exited with code %u\n", dwExitCode );

? ? GetExitCodeThread( hth2, &dwExitCode );
? ? printf( "thread 2 exited with code %u\n", dwExitCode );

? ? CloseHandle( hth1 );
? ? CloseHandle( hth2 );

? ? delete o1;
? ? o1 = NULL;

? ? delete o2;
? ? o2 = NULL;

? ? printf("Primary thread terminating.\n");
?? ?return 0;
}

注意:

  • (1)如果你正在編寫C/C++代碼,決不應(yīng)該調(diào)用CreateThread。相反,應(yīng)該使用VisualC++運(yùn)行期庫函數(shù)_beginthreadex,退出也應(yīng)該使用_endthreadex。如果不使用Microsoft的VisualC++編譯器,你的編譯器供應(yīng)商有它自己的CreateThread替代函數(shù)。不管這個(gè)替代函數(shù)是什么,你都必須使用。
  • (2)因?yàn)?code>_beginthreadex和_endthreadex是CRT線程函數(shù),所以必須注意編譯選項(xiàng)runtimelibaray的選擇,使用MT或MTD。[MultiThreaded , Debug MultiThreaded]。
  • (3)_beginthreadex函數(shù)的參數(shù)列表與CreateThread函數(shù)的參數(shù)列表是相同的,但是參數(shù)名和類型并不完全相同。這是因?yàn)镸icrosoft的C/C++運(yùn)行期庫的開發(fā)小組認(rèn)為,C/C++運(yùn)行期函數(shù)不應(yīng)該對(duì)Windows數(shù)據(jù)類型有任何依賴。_beginthreadex函數(shù)也像CreateThread那樣,返回新創(chuàng)建的線程的句柄。
  • (4)C++主線程的終止,同時(shí)也會(huì)終止所有主線程創(chuàng)建的子線程,不管子線程有沒有執(zhí)行完畢。所以上面的代碼中如果不調(diào)用WaitForSingleObject,則2個(gè)子線程t1和t2可能并沒有執(zhí)行完畢或根本沒有執(zhí)行。
  • (5)如果某線程掛起,然后有調(diào)用WaitForSingleObject等待該線程,就會(huì)導(dǎo)致死鎖。所以上面的代碼如果不調(diào)用resumethread,則會(huì)死鎖。

二、_beginthreadex()與代CreateThread()區(qū)別                                   

CreateThread是Windows的API函數(shù)(SDK函數(shù)的標(biāo)準(zhǔn)形式,直截了當(dāng)?shù)膭?chuàng)建方式,任何場(chǎng)合都可以使用),提供操作系統(tǒng)級(jí)別的創(chuàng)建線程的操作,且僅限于工作者線程。不調(diào)用MFC和RTL的函數(shù)時(shí),可以用CreateThread,其它情況不要輕易。在使用的過程中要考慮到進(jìn)程的同步與互斥的關(guān)系(防止死鎖)。線程函數(shù)定義為:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。但它沒有考慮:

  • (1)C Runtime中需要對(duì)多線程進(jìn)行紀(jì)錄和初始化,以保證C函數(shù)庫工作正常(典型的例子是strtok函數(shù))。
  • (2)MFC也需要知道新線程的創(chuàng)建,也需要做一些初始化工作(當(dāng)然,如果沒用MFC就沒事了)。  

AfxBeginThread:MFC中線程創(chuàng)建的MFC函數(shù),首先創(chuàng)建了相應(yīng)的CWinThread對(duì)象,然后調(diào)用CWinThread::CreateThread,   在CWinThread::CreateThread中,完成了對(duì)線程對(duì)象的初始化工作,然后,調(diào)用_beginthreadex(AfxBeginThread相比較更為安全)創(chuàng)建線程。它簡化了操作或讓線程能夠響應(yīng)消息,即可用于界面線程,也可以用于工作者線程,但要注意不要在一個(gè)MFC程序中使用_beginthreadex()或CreateThread()。線程函數(shù)定義為:UINT
_yourThreadFun(LPVOID pParam)

_beginthreadex:MS對(duì)C Runtime庫的擴(kuò)展SDK函數(shù),首先針對(duì)C Runtime庫做了一些初始化的工作,以保證C Runtime庫工作正常。然后,調(diào)用CreateThread真正創(chuàng)建線程。 僅使用Runtime Library時(shí),可以用_BegingThread。

  • 小節(jié):實(shí)際上,這三個(gè)函數(shù)之間存在一定的調(diào)用關(guān)系,第一個(gè)純粹一些,后兩個(gè)完成自己相應(yīng)的工作之后,調(diào)用前者實(shí)現(xiàn)線程的創(chuàng)建。其中CreateThread是由操作系統(tǒng)提供的接口,而AfxBeginThread_BeginThread則是編譯器對(duì)它的封裝。
  • 小節(jié):用_beginthreadex()、_endthreadex函數(shù)應(yīng)該是最佳選擇,且都是C Run-time Library中的函數(shù),函數(shù)的參數(shù)和數(shù)據(jù)類型都是C Run-time Library中的類型,這樣在啟動(dòng)線程時(shí)就不需要進(jìn)行Windows數(shù)據(jù)類型和C Run-time Library中的數(shù)據(jù)類型之間的轉(zhuǎn)化,從而,減低了線程啟動(dòng)時(shí)的資源消耗和時(shí)間的消耗。但使用_beginthread,無法創(chuàng)建帶有安全屬性的新線程,無法創(chuàng)建暫停的線程,也無法獲得 線程ID,_endthread的情況類似,它不帶參數(shù),這意味這線程的退出代碼必須硬編碼為0。
  • 小節(jié):MFC也是C++類庫(只不過是Microsoft的C++類庫,不是標(biāo)準(zhǔn)的C++類庫),在MFC中也封裝了new和delete兩中運(yùn)算符,所以用到new和delete的地方不一定非要使用_beginthreadex() 函數(shù),用其他兩個(gè)函數(shù)都可以。

_beginthreadex_beginthread在回調(diào)入口函數(shù)之前進(jìn)行一些線程相關(guān)的CRT的初始化操作。
CRT的函數(shù)庫在線程出現(xiàn)之前就已經(jīng)存在,所以原有的CRT不能真正支持線程,
這也導(dǎo)致了許多CRT的函數(shù)在多線程的情況下必須有特殊的支持,不能簡單的使用CreateThread就OK。
 

補(bǔ)充一點(diǎn):_beginthreadex()是針對(duì)CRT的線程函數(shù),在線程中若要用到CRT的函數(shù),最好用這個(gè)啟動(dòng)線程,如果不用這個(gè)會(huì)有內(nèi)存泄漏。

到此這篇關(guān)于詳解_beginthreadex()創(chuàng)建線程的文章就介紹到這了,更多相關(guān)_beginthreadex()創(chuàng)建線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++變換迭代器使用方法小結(jié)

    C++變換迭代器使用方法小結(jié)

    本文主要介紹了C++變換迭代器使用方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • c++中?isupper()和islower()函數(shù)詳解

    c++中?isupper()和islower()函數(shù)詳解

    在C++中,islower()和isupper()是C++標(biāo)準(zhǔn)庫中提供的兩個(gè)字符判斷函數(shù),這兩個(gè)函數(shù)用于判斷一個(gè)字符是否為小寫字母或大寫字母,這篇文章主要介紹了c++?isupper()?islower()的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)

    常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)

    C++標(biāo)準(zhǔn)庫定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫頭文件,需要的朋友可以參考下
    2023-11-11
  • C++OOP對(duì)象和類的詳細(xì)講解

    C++OOP對(duì)象和類的詳細(xì)講解

    這篇文章主要介紹了C++面相對(duì)象編程中的類與對(duì)象的特性與概念,OOP面向?qū)ο笳Z言相對(duì)C語言這樣面相過程的語言來說具有類和對(duì)象以及方法這樣的特性,需要的朋友可以參考下
    2021-08-08
  • C++嵌入式內(nèi)存管理詳情

    C++嵌入式內(nèi)存管理詳情

    這篇文章主要介紹了C++嵌入式內(nèi)存管理,是對(duì)上一篇內(nèi)存的一個(gè)補(bǔ)充,主要講解Linux中的內(nèi)存;這部分對(duì)于一些端側(cè)部署的伙伴來說比較重要,推薦針對(duì)不同的板子,下面來看看詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2021-12-12
  • C語言指針入門的簡單實(shí)例教程

    C語言指針入門的簡單實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于C語言指針入門的簡單實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • c++讀寫文件流實(shí)例程序講解

    c++讀寫文件流實(shí)例程序講解

    這篇文章主要介紹了c++讀寫文件流實(shí)例,大家參考使用吧
    2013-12-12
  • c語言經(jīng)典習(xí)題之逆序字符串詳解

    c語言經(jīng)典習(xí)題之逆序字符串詳解

    這篇文章主要為大家介紹了c語言習(xí)題之逆序字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 深入uCOS中全局變量的使用詳解

    深入uCOS中全局變量的使用詳解

    本篇文章是對(duì)uCOS中全局變量的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn)

    vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn)

    本文主要介紹了vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

集贤县| 西畴县| 嵩明县| 开阳县| 凉城县| 上栗县| 会宁县| 赤水市| 班戈县| 隆林| 乌审旗| 龙海市| 绥阳县| 渭南市| 石家庄市| 鹤壁市| 东方市| 大方县| 富源县| 五指山市| 易门县| 桂阳县| 洪江市| 资溪县| 祁东县| 炎陵县| 监利县| 金寨县| 林甸县| 甘德县| 余庆县| 雷州市| 新沂市| 同德县| 青海省| 东乡族自治县| 逊克县| 海林市| 水富县| 惠来县| 伊金霍洛旗|