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

c++多线程实例

2013-07-21 02:45 225 查看

原文地址

注意:在编译多线程文件之前,在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 )
  {
    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, 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 );//你需要恢复线程的句柄 使用该函数能够激活线程的运行
    // In C++/CLI the process continues until the last thread exits.
    // That is, the thread's have independent lifetimes. Hence
    // Jaeschke's original code was designed to show that the primary
    // thread could exit and not influence the other threads.
    // However in C++ the process terminates when the primary thread exits
    // and when the process terminates all its threads are then terminated.
    // Hence if you comment out the following waits, the non-primary
    // threads will never get a chance to run.
    WaitForSingleObject( hth1, INFINITE );
    WaitForSingleObject( hth2, INFINITE );
           //WaitForSingleObject 函数用来检测 hHandle 事件的信号状态,当函数的执行时间超过 dwMilliseconds 就返回,
     //但如果参数 dwMilliseconds 为 INFINITE 时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去
     //,直到 WaitForSingleObject 有返回直才执行后面的代码
    GetExitCodeThread( hth1, &dwExitCode );
    printf( "thread 1 exited with code %u\n", dwExitCode );
    GetExitCodeThread( hth2, &dwExitCode );
    printf( "thread 2 exited with code %u\n", dwExitCode );
         //
//GetExitCodeThread这个函数是获得线程的退出码, 第二个参数是一个 DWORD的指针, //用户应该使用一个 DWORD 类型的变量去接收数据,返回的数据是线程的退出码, //第一个参数是线程句柄,用 CreateThread 创建线程时获得到。 //通过线程退出码可以判断线程是否正在运行,还是已经退出。

    // The handle returned by _beginthreadex() has to be closed
    // by the caller of _beginthreadex().
    CloseHandle( hth1 );
    CloseHandle( hth2 );
    delete o1;
    o1 = NULL;
    delete o2;
    o2 = NULL;
    printf("Primary thread terminating.\n");
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: