【C++編程】C++實現多線程編程

來源:互聯網
上載者:User

標籤:c++多線程   多線程編程   封裝   beginproce   

在C++的多線程編程實現裡有兩種方式,一種是Windows標頭檔裡的CreateProcess,另一種是process.h裡的_beginthread,我這裡用的是後一種,並且將多線程操作封裝成了類似Java裡的Thread類。

Thread類包含四種操作(對應線程的幾種狀態):就緒(start),掛起(suspend)、恢複(resume)以及終止(terminate),另外,還包含了一個可以設定線程逾時的操作。

Thread類代碼如下(Thread.h):

#ifndef THREAD_H#define THREAD_H#include <windows.h>#include <process.h>typedef void *HANDLE;class Thread{public:    Thread();                               //構造器    void         start();                   //線程啟動函數    virtual void run();                     //線程運行函數    int          suspend();                 //線程掛起,返回之前掛起次數    int          resume();                  //線程恢複,返回之前的掛起次數    void         terminate();               //強行終止進程    void         setTimeOut(DWORD time);    //設定逾時時間,預設為INFINITE    DWORD        getTimeOut();              //返回逾時時間private:    HANDLE m_h;                             //當前線程的控制代碼    DWORD  m_timeout;                       //逾時時間    static void init(void *_h);             //運行當前線程};#endif

實現檔案(Thread.cpp):

#include <iostream>using std::cin;using std::cout;using std::endl;#include "Thread.h"Thread::Thread(){    m_timeout = INFINITE;               //設定預設的逾時,為無窮大}void Thread::start(){    m_h = (HANDLE)_beginthread(init, 0, (void *)this);      //建立線程}void Thread::run(){    //線程運行方法}void Thread::init(void* _h){    Thread *t = (Thread*)_h;    t->run();    DWORD dw = WaitForSingleObject(t->m_h, t->m_timeout); //等待線程,500ms後逾時結束,INFINITE表示不逾時    switch (dw)    {    case WAIT_OBJECT_0:        break;    case WAIT_TIMEOUT: cout << "Time Out" << endl;        break;    case WAIT_FAILED:        break;    }}//線程掛起,返回之前掛起次數int Thread::suspend(){    return SuspendThread(this->m_h);}//線程恢複,返回之前的掛起次數int Thread::resume(){    DWORD re = ResumeThread(this->m_h);    return re;}//強行終止進程void Thread::terminate(){    TerminateThread(this->m_h, EXIT_SUCCESS);}//設定逾時時間,預設為INFINITEvoid Thread::setTimeOut(DWORD time){    this->m_timeout = time;}//返回逾時時間DWORD Thread::getTimeOut(){    return this->m_timeout;}

測試檔案(TestThread.cpp):

 //測試檔案#include "Thread.h"#include <windows.h>#include <process.h>#include <iostream>using std::cin;using std::cout;using std::endl;#include <string>using std::string;class TestThread : public Thread{public:    TestThread(string _s){        s = _s;    }    string s;    void run();};void TestThread::run(){    for (int i = 0; i < 10; i++){        cout <<s+"\n";    }}int main(int argc, char *argv[]){    TestThread *dt[10];    dt[0] = new TestThread("A");        //建立線程A    dt[1] = new TestThread("B");        //建立線程B    dt[0]->start();                     //開啟線程A    cout<<dt[0]->suspend()<<endl;       //掛起線程A    dt[1]->setTimeOut(500);    dt[1]->start();                     //開啟線程B    Sleep(2000);                        //暫停2s,此時線程A仍屬於掛起狀態,所以不執行    dt[0]->resume();                    //恢複線程A,此時線程A屬於恢複狀態,繼續執行    getchar();}

測試結果

【C++編程】C++實現多線程編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.