您的位置:首页 > 编程语言 > C语言/C++

C++多线程实例

2015-01-09 15:10 274 查看
注意:在编译多线程文件之前,在VC上要作相应的设置Projects->settiong->C/C++,选择Category:Code Generation,Use run-time library:Debug MutiThreaded

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

  static unsigned __stdcall ThreadStaticEntryPoint(void * pThis);

  void ThreadEntryPoint();

};

ThreadX::ThreadX(int startValue, int endValue, int frequency)

{
loopStart = startValue;

    loopEnd = endValue;

    dispFrequency = frequency;

}

unsigned __stdcall ThreadX::ThreadStaticEntryPoint(void * pThis)

{
ThreadX * pthX = (ThreadX*)pThis;
pthX->ThreadEntryPoint();
return 0;  

}

void ThreadX::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, 3000, 200 );

    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( -1000, 0, 200 );

    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";

    // If we hadn't specified CREATE_SUSPENDED in the call to _beginthreadex()

    // we wouldn't now need to call ResumeThread().

    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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: