• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            2.創建線程

              進程的主線程由操作系統自動生成,Win32提供了CreateThread API來完成用戶線程的創建,該API的原型為:

            HANDLE CreateThread(
             LPSECURITY_ATTRIBUTES lpThreadAttributes,//Pointer to a SECURITY_ATTRIBUTES structure
             SIZE_T dwStackSize, //Initial size of the stack, in bytes.
             LPTHREAD_START_ROUTINE lpStartAddress,
             LPVOID lpParameter, //Pointer to a variable to be passed to the thread
             DWORD dwCreationFlags, //Flags that control the creation of the thread
             LPDWORD lpThreadId //Pointer to a variable that receives the thread identifier
            );

              如果使用C/C++語言編寫多線程應用程序,一定不能使用操作系統提供的CreateThread API,而應該使用C/C++運行時庫中的_beginthread(或_beginthreadex),其函數原型為:

            uintptr_t _beginthread(
             void( __cdecl *start_address )( void * ), //Start address of routine that begins execution of new thread
             unsigned stack_size, //Stack size for new thread or 0.
             void *arglist //Argument list to be passed to new thread or NULL
            );
            uintptr_t _beginthreadex(
             void *security,//Pointer to a SECURITY_ATTRIBUTES structure
             unsigned stack_size,
             unsigned ( __stdcall *start_address )( void * ),
             void *arglist,
             unsigned initflag,//Initial state of new thread (0 for running or CREATE_SUSPENDED for suspended);
             unsigned *thrdaddr
            );

              _beginthread函數與Win32 API 中的CreateThread函數類似,但有如下差異:

              (1)通過_beginthread函數我們可以利用其參數列表arglist將多個參數傳遞到線程;

             ?。?)_beginthread 函數初始化某些 C 運行時庫變量,在線程中若需要使用 C 運行時庫。

              3.終止線程

              線程的終止有如下四種方式:

              (1)線程函數返回;

             ?。?)線程自身調用ExitThread 函數即終止自己,其原型為:

            VOID ExitThread(UINT fuExitCode );

              它將參數fuExitCode設置為線程的退出碼。

              注意:如果使用C/C++編寫代碼,我們應該使用C/C++運行時庫函數_endthread (_endthreadex)終止線程,決不能使用ExitThread!
            _endthread 函數對于線程內的條件終止很有用。例如,專門用于通信處理的線程若無法獲取對通信端口的控制,則會退出。

             ?。?)同一進程或其他進程的線程調用TerminateThread函數,其原型為:

            BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

              該函數用來結束由hThread參數指定的線程,并把dwExitCode設成該線程的退出碼。當某個線程不再響應時,我們可以用其他線程調用該函數來終止這個不響應的線程。

             ?。?)包含線程的進程終止。

              最好使用第1種方式終止線程,第2~4種方式都不宜采用。

              4.掛起與恢復線程

              當我們創建線程的時候,如果給其傳入CREATE_SUSPENDED標志,則該線程創建后被掛起,我們應使用ResumeThread恢復它:

            DWORD ResumeThread(HANDLE hThread);

              如果ResumeThread函數運行成功,它將返回線程的前一個暫停計數,否則返回0x FFFFFFFF。

              對于沒有被掛起的線程,程序員可以調用SuspendThread函數強行掛起之:

            DWORD SuspendThread(HANDLE hThread);

              一個線程可以被掛起多次。線程可以自行暫停運行,但是不能自行恢復運行。如果一個線程被掛起n次,則該線程也必須被恢復n次才可能得以執行。
            Posted on 2006-11-18 14:20 艾凡赫 閱讀(665) 評論(0)  編輯 收藏 引用 所屬分類: 多線程
            99久久久精品免费观看国产| 国内精品久久久久久麻豆| 久久久久免费精品国产| 天天爽天天狠久久久综合麻豆| 亚洲AV无码久久精品成人| 91精品国产9l久久久久| 亚洲а∨天堂久久精品| 日韩人妻无码精品久久久不卡| 久久精品国产亚洲av麻豆蜜芽| 色偷偷88888欧美精品久久久| 亚洲成色999久久网站| 久久综合狠狠综合久久97色| 久久香蕉超碰97国产精品| 久久人妻少妇嫩草AV蜜桃| 久久综合综合久久综合| 欧美久久天天综合香蕉伊| jizzjizz国产精品久久| 久久久久青草线蕉综合超碰| 精品人妻伦九区久久AAA片69| 性做久久久久久久| 一级a性色生活片久久无| 久久国产精品一区二区| 一本色道久久99一综合| 无码任你躁久久久久久| 国内精品久久久久久久影视麻豆| 精品熟女少妇AV免费久久| 久久影院亚洲一区| 狠狠精品干练久久久无码中文字幕| 色欲综合久久躁天天躁蜜桃| 久久亚洲精品无码VA大香大香| 国产精品免费久久久久久久久| 久久香蕉国产线看观看乱码| 久久精品免费一区二区| 亚洲精品午夜国产va久久| 久久久久久av无码免费看大片| 久久久精品免费国产四虎| 久久精品国产亚洲av麻豆小说| 色综合久久久久综合体桃花网| 奇米影视7777久久精品人人爽| 亚洲?V乱码久久精品蜜桃| 一本久久a久久精品综合香蕉|