zoukankan      html  css  js  c++  java
  • ACE线程管理机制面向对象的线程类ACE_Task

    我们在前一章中使用ACE_Thread包装时,你一定已经注意到了一些不够"优雅"的地方。那一章中的大多数程序都被分解为函数、而不是对象。这是因为ACE_Thread包装需要一个全局函数名、或是静态方法作为参数。随后该函数(静态方法)就被用作所派生的线程的"启动点"。这自然就使得程序员要为每个线程写一个函数。如我们已经看到的,这可能会导致非面向对象的程序分解。

    ACE_Task对常用线程处理进行了OO包装,通过ACE_Task,能对线程进行更好的操作。

    要创建任务,需要进行以下步骤:

    1. 实现服务初始化和终止方法:
      open()方法应该包含所有专属于任务的初始化代码。其中可能包括诸如连接控制块、锁和内存这样的资源。close()方法是相应的终止方法。
    2. 调用启用(Activation)方法:
      在主动对象实例化后,你必须通过调用activate()启用它。要在主动对象中创建的线程的数目,以及其他一些参数,被传递给activate()方法。activate()方法会使svc()方法成为所有它生成的线程的启动点。
    3. 实现服务专有的处理方法:
      如上面所提到的,在主动对象被启用后,各个新线程在svc()方法中启动。应用开发者必须在子类中定义此方法。

    下面的例子演示怎样去创建任务:

    #include "ace/Task.h"
    #include "ace/OS.h"

    #include <iostream>
    using namespace std;

    class TaskThread: public ACE_Task<ACE_MT_SYNCH>
    {
    public:
        virtual int svc(void)
        {
            for(int i=0;i<10;i++)
            {
                ACE_OS::sleep(1);
                cout<<endl<<"hello thread1"<<endl;
            }
            return 0;
        }
    };

    int main(int argc, char *argv[])
    {
        TaskThread task;
        task.activate();
        
        while(true)
            ACE_OS::sleep(10);

        return 0;
    }

    ACE_Task也封装了常用线程操作,如暂停,恢复及停止等,是不是非常简单和方便呢。

    其实ACE_Task的使用还不仅仅是这些,通过它还可实现一种很常用的网络编程模式--主动对象模式,其具体功能在后续的设计模式部分将作详细的介绍。

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/TianFang/p/583231.html
Copyright © 2011-2022 走看看