关闭

C++/CLR 中的多线程使用方法

标签: clr多线程
1776人阅读 评论(0) 收藏 举报
分类:

C++/CLR 中的多线程使用方法

本文由Monkey Man 撰写于 2015/7/10 0:41:33

在编写大型程序时,将所有任务都放在一条线程上来完成并不是一个明智的选择,因为程序一旦卡死在某个环节或是发生了死循环,整个程序都会废掉。所以适当的用多线程有利于程序的良好运行。

在C++/CLR中使用多线程是很方便的,以下介绍使用方法:

  • 添加命名空间using namespace System::Threading;

  • 创建新的线程Thread ^ oThread = gcnew Thread( gcnew ThreadStart( this, &data::df ));

  • 启动新的线程oThread->Start();

  • 关闭新的线程oThread->Abort(); 在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。

  • 挂起线程Thread::Sleep( n); n代表需要挂起的时间,单位为毫秒。哪个线程调用这个方法,哪个线程就挂起 n 毫秒。

    • This: 指当前的窗口句柄或指针。

    • &data::df: 你要在新进程里完成的任务。df 是data类中的一个函数。

一个例子:

    // [C++]
    //我用的编译环境是VS2010
    //使用/clr选项编译.
    using namespace System;
    using namespace System::Threading;

    // 简单的多线程示例:在第二个线程中运行
    //一个公有的方法 ThreadProc.
    public ref class ThreadExample
    {
    public:

       //在新线程中调用 ThreadProc 方法。
       //这个方法将会运行十次,每次都会向控制台输出一行文本,然后
       //挂起很短的一段时间。运行十次后结束运行。
       static void ThreadProc()
       {
          for ( int i = 0; i < 10; i++ )
          {
              Console::Write(  "ThreadProc: " );
              Console::WriteLine( i );

              // 把第二个线程挂起一段时间
              Thread::Sleep( 0 );
          }
       }   
    };

    int main()
    {
       Console::WriteLine( "主线程: 开启了第二个线程。" );
       //要说明的一点是,第一个线程就是当前 main() 函数所在的线程。

       // Create the thread, passing a ThreadStart delegate that
       // represents the ThreadExample::ThreadProc method.  For a 
       // delegate representing a static method, no object is
       // required.
       //这段我不会翻译,求看到这篇文章的大神赐教。
       //创建第二个线程。
       Thread^ oThread = gcnew Thread( gcnew ThreadStart(&ThreadExample::ThreadProc ) );

       // Start ThreadProc.  Note that on a uniprocessor, the new 
       // thread does not get any processor time until the main thread 
       // is preempted or yields.  Uncomment the Thread::Sleep that 
       // follows oThread->Start() to see the difference.
       //这段我也不会翻译,求看到这篇文章的大神赐教。
       //启动第二个线程
       oThread->Start();

       for ( int i = 0; i < 4; i++ )
       {
          Console::WriteLine(  "主线程: 做了些事情。" );
          //下面这个Thread::Sleep( 0 );的作用是把主线程挂起一段时间
          Thread::Sleep( 0 );

       }
       Console::WriteLine(  "主线程: 调用 Join(), 等待 ThreadProc 方法运行结束." );
       oThread->Join();
       Console::WriteLine(  "主线程: ThreadProc->Join() 已经返回控制权.  按任意键退出程序。" );
       Console::ReadLine();
       return 0;
    }

此代码产生的输出类似如下内容:

主线程: 开启了第二个线程。
主线程: 做了些事情。
ThreadProc: 0
ThreadProc: 1
ThreadProc: 2
ThreadProc: 3
ThreadProc: 主线程: 做了些事情。
主线程: 做了些事情。
主线程: 做了些事情。
4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
主线程: 调用 Join(), 等待 ThreadProc 方法运行结束.
主线程: ThreadProc->Join() 已经返回控制权.  按任意键退出程序。

当然这里所呈现的结果并不唯一,运行时机器的状况和资源配置的状况会使主线程和第二条线程的运行情况发生变化。有时主线程会先运行完,然后等待第二个线程运行完;有时第二个线程会先运行完,然后主线程的输出跟在后面;也有可能两条线程的运行状况都差不多(比如上面那个示例输出。细心的人会发现第七行应该在同一行输出的 ThreadProc: 4 被拆到了第七行和第十行)。下面我们再看两组输出:

情况一:主线程会先运行完,然后等待第二个线程运行完

主线程: 开启了第二个线程。
主线程: 做了些事情。
主线程: 做了些事情。
主线程: 做了些事情。
主线程: 做了些事情。
主线程: 调用 Join(), 等待 ThreadProc 方法运行结束.
ThreadProc: 0
ThreadProc: 1
ThreadProc: 2
ThreadProc: 3
ThreadProc: 4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
主线程: ThreadProc->Join() 已经返回控制权.  按任意键退出程序。

情况二:第二个线程先运行完,然后主线程的输出跟在后面

主线程: 开启了第二个线程。
主线程: 做了些事情。
ThreadProc: 0
ThreadProc: 1
ThreadProc: 2
ThreadProc: 3
ThreadProc: 4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
主线程: 做了些事情。
主线程: 做了些事情。
主线程: 做了些事情。
主线程: 调用 Join(), 等待 ThreadProc 方法运行结束.
主线程: ThreadProc->Join() 已经返回控制权.  按任意键退出程序。

各位可以自己试一试,看看自己会产生那些运行结果(^ . ^)

参考:MSDN文档

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2259次
    • 积分:65
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档