关闭

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

标签: clr多线程
1980人阅读 评论(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网站的观点或立场

如何:定义和使用委托 (C++/CLI)

https://technet.microsoft.com/zh-CN/library/c320cx3h.aspx/如何:定义和使用委托 (C++/CLI)Visual Studio 2015其他版本...
  • Nhsoft
  • Nhsoft
  • 2016-09-01 23:49
  • 7712

C++11的线程库(一)

个人认为C++11最明智的举动之一就是加入了线程库,在多核CPU越来越普及,在多线程编程日益,我们可以说是”疯狂“的时代,一个不支持多线程(我是指本身不支持,在编程过程中需要依赖线程库)的语言,如何能...
  • charles_r_chiu
  • charles_r_chiu
  • 2015-05-27 17:24
  • 2833

C# Timer的多线程使用方法

  • 2013-03-29 10:55
  • 58KB
  • 下载

ros(robot operating system机器人操作系统)订阅函数的多线程使用方法(C++: 外部变量控制跳出for循环)

最初是想实现接收到某个some_topic然后解析内容,若是内容为指令action,action函数进入for循环,若是再接收到some_topic,里面指令为stop则stop=true停止正在进行...
  • w383117613
  • w383117613
  • 2015-05-08 10:11
  • 1693

多线程简介与使用方法

  • 2014-12-23 11:50
  • 2KB
  • 下载

多线程起步,总结的,一些方法的使用,简单的列子,使用方法

  • 2008-11-15 10:25
  • 5KB
  • 下载

python学习笔记4:多进程和多线程的使用方法和区别

进程 python实现多进程,可以用fork()系统调用,但是不推荐这个方法,因为这个方法Windows没有。 我们还可以用模块multiprocessing,其中的Process类可以用来表示一...
  • XunMengC
  • XunMengC
  • 2017-03-14 12:19
  • 167

android的AsyncTask使用方法-多线程下载

public class MainActivity extends Activity implements OnClickListener { private Button btn1, btn2, ...
  • yhm2046
  • yhm2046
  • 2013-12-05 01:03
  • 1562

多线程在C、Win32和MFC下的使用方法

一.前言     线程是执行路径。一个进程至少要有一个线程,也可能包含多个线程。若进程关闭了,则在进程中所有的线程也自动被销毁。当我们在一个应用程序中创建一个线程时,实际上,它是第二个线程。在C或C...
  • cosmoslife
  • cosmoslife
  • 2012-05-13 15:21
  • 413

多线程在C、Win32和MFC下的使用方法

原文地址:http://www.vckbase.com/document/viewdoc/?id=1978 一.前言     线程是执行路径。一个进程至少要有一个线程,也可能包含多个线程。若进程关...
  • tinyhell127
  • tinyhell127
  • 2012-04-19 11:32
  • 967
    个人资料
    • 访问:2506次
    • 积分:68
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档