ACE中TASK架构简介及简单应用

news2024/10/7 8:23:06

首先配置ACE环境:

#include <iostream>
#include "ace/Synch.h"
#include "ace/Task.h"
#include "ace/Message_Block.h"

#ifdef _DEBUG
#pragma comment(lib,"aced.lib")
//#pragma comment(lib,"mysqlcppconnd.lib")  //需要编译生成
#else
#pragma comment(lib,"ace.lib")
#endif

char test_message[] = "test_message";
#define MAX_MESSAGES 10
class Counting_Test_Producer : public ACE_Task<ACE_MT_SYNCH>
{
public:
    Counting_Test_Producer(ACE_Message_Queue<ACE_MT_SYNCH>* queue)
        :ACE_Task<ACE_MT_SYNCH>(0, queue) {}
    virtual int svc(void);
};

int Counting_Test_Producer::svc(void)
{
    int produced = 0;
    char data[256] = { 0 };
    ACE_Message_Block* b = 0;

    while (1)
    {
        ACE_OS::sprintf(data, "%s--%d.\n", test_message, produced);

        //创建消息块
        ACE_NEW_NORETURN(b, ACE_Message_Block(256));
        if (b == 0)
        {
            break;
        }

        //将data中的数据复制到消息块中
        b->copy(data, 256);
        if (produced >= MAX_MESSAGES)
        {
            //如果是最后一个数据,那么将数据属性设置为MB_STOP
            b->msg_type(ACE_Message_Block::MB_STOP);

            //将消息块放入队列中
            if (this->putq(b) == -1)
            {
                b->release();
                break;
            }
            produced++;
            ACE_DEBUG((LM_DEBUG, ACE_TEXT("Producer put the data: %s.\n"), b->base()));
            break;
        }
        if (this->putq(b) == -1)
        {
            b->release();
            break;
        }
        produced++;

        ACE_DEBUG((LM_DEBUG, ACE_TEXT("Producer put the data: %s.\n"), b->base()));
        ACE_OS::sleep(1);
    }
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("Producer done\n")));
    return 0;
}

class Counting_Test_Consumer : public ACE_Task<ACE_MT_SYNCH>
{
public:
    Counting_Test_Consumer(ACE_Message_Queue<ACE_MT_SYNCH>* queue)
        :ACE_Task<ACE_MT_SYNCH>(0, queue) {}
    virtual int svc(void);
};

int Counting_Test_Consumer::svc(void)
{
    int consumer = 0;
    ACE_Message_Block* b = 0;
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("in consumer svc.\n")));
    ACE_OS::sleep(30);
    while (1)
    {
        //循环从队列中读取数据块,如果读取失败,那么退出线程
        if (this->getq(b) == -1)
        {
            break;
        }
        if (b->msg_type() == ACE_Message_Block::MB_STOP)
        {
            //如果消息属性是MB_STOP,那么表示其为最后一个数据
            ACE_DEBUG((LM_DEBUG, ACE_TEXT("Consumer get the data: %s.\n"), b->base()));
            ACE_DEBUG((LM_DEBUG, ACE_TEXT("Consumer get the stop msg.\n")));
            b->release();
            consumer++;
            break;
        }
        ACE_DEBUG((LM_DEBUG, ACE_TEXT("Consumer get the data: %s.\n"), b->base()));
        b->release();
        consumer++;
        ACE_OS::sleep(5);
    }

    ACE_DEBUG((LM_DEBUG, ACE_TEXT("Consumer done\n")));
    return 0;
}

int main(int argc, ACE_TCHAR* argv[])
{
    //创建消息队列
    ACE_Message_Queue<ACE_MT_SYNCH> queue(2 * 1024 * 1024);

    // 创建生产者和消费者,它们使用同一个消息队列,只有这样才能实现线程间消息的传递
    Counting_Test_Producer producer(&queue);
    Counting_Test_Consumer consumer(&queue);

    //调用activate函数创建消费者线程
    if (consumer.activate(THR_NEW_LWP | THR_DETACHED | THR_INHERIT_SCHED, 1) == -1)
    {
        ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("Consumers %p\n"), ACE_TEXT("activate")), -1);
    }

    //调用activate函数创建生产者线程
    if (producer.activate(THR_NEW_LWP | THR_DETACHED | THR_INHERIT_SCHED, 1) == -1)
    {
        ACE_ERROR((LM_ERROR, ACE_TEXT("Producers %p\n"), ACE_TEXT("activate")));
        consumer.wait();
        return -1;
    }
    //调用wait函数等待线程结束
    ACE_Thread_Manager::instance()->wait();
    ACE_DEBUG((LM_DEBUG, ACE_TEXT("Ending test!\n")));
    return 0;
}
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现逻辑回归(Logistic Regression)

&#x1f4a5; 项目专栏&#xff1a;【Python实现经典机器学习算法】附代码原理介绍 文章目录 前言一、基于原生Python实现逻辑回归算法二、逻辑回归模型的算法原理三、算法实现3.1 导包3.2 定义随机数种子3.3 定义逻辑回归模型3.3.1 模型训练3.3.1.1 初始化参数3.3.1.2 正向传…

电力通信实用小技巧,一看就懂!

随着电力通信技术的快速发展&#xff0c;电力通信机房扮演着至关重要的角色&#xff0c;确保电力系统的正常运行和通信网络的稳定连接。 然而&#xff0c;电力通信机房的环境和设备面临着各种潜在的风险和挑战&#xff0c;如温度过高、湿度异常、电力故障等。为了有效监控和管理…

Canonical:我们对探索完全容器化、不可改变的Ubuntu桌面的想法感到兴奋

导读Canonical的Oliver Smith近日在一篇博文中写道&#xff0c;这个最受欢迎的GNU/Linux发行版之一背后的公司很高兴在不久的将来使用Ubuntu Core和Snaps探索完全容器化和不可变的Ubuntu桌面的想法。 在今年早些时候宣布从Ubuntu 23.04&#xff08;Lunar Lobster&#xff09;开…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级&#xff0c;负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流&#xff0c;并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括&#xff1a; 传输介质&#xff1a…

基于springboot的阅读系统-计算机毕设 附源码86095

基于springboot的阅读系统 摘 要 从古至今&#xff0c;阅读都是人们学习新技能&#xff0c;新知识的一种方式。随着互联网时代的到来&#xff0c;传统的纸质阅读早已满足不了人们对于阅读的渴望。在这样的大背景下&#xff0c;电子阅读便快速崛起。越来越多的人们喜欢愿意通过这…

这个传感器真的可以解决问题吗?

倒闭了 之前在文章里面写了我创业开发的猫塔&#xff0c;其中有一个问题是&#xff0c;因为猫砂重量不一致&#xff0c;磁铁老化等等问题&#xff0c;可能导致在倒砂的时候不能准确让沙仓回到正确的位置。 有个朋友在文章后面回复了一个方案&#xff0c;就是用编码器。 先简单说…

Linux网络操作实操指南:从网络配置到安全管理

目录 1. 网络配置2. 网络诊断3. 网络服务管理4. 网络安全5. 小结 Linux是一种开源的操作系统&#xff0c;具有稳定性高、安全性好、可定制性强等优点。作为一名Linux用户&#xff0c;掌握基本的Linux网络操作是非常必要的。以下是Linux网络操作的几个方面&#xff0c;包括具体的…

6款程序员实用工具,老少皆宜,你一定用得上!

从事开发行业已有4年之久&#xff0c;在此期间积累了不少好用的开发工具&#xff0c;希望帮助各位在工作上化繁为简&#xff0c;提升个人生产力。 这里的分享本着1个原则去做&#xff1a; 凡是需要重复做的&#xff0c;必须使用自动化工具来完成。 01、单元测试工具——PHPUnit…

7从0开始学PyTorch | PyTorch中求导、梯度、学习率、归一化

今天我们继续&#xff0c;接着昨天的进度。 先回顾一下上一小节&#xff0c;我学到了构建起一个模型函数和一个损失函数&#xff0c;然后我们使用人眼观察损失&#xff0c;并手动调整模型参数。然而看起来&#xff0c;我们虽然看到了损失&#xff0c;但我们调整参数的方案跟损失…

【Python学习】—认识Python与环境搭建(一)

【Python学习】—认识Python与环境搭建&#xff08;一&#xff09; 本章节思维导图如下&#xff1a; 一、Python解释器 首先一个基本原理就是&#xff1a;计算机只认识二进制&#xff0c;0和1 Python解释器&#xff0c;是一个计算机程序&#xff0c;用来翻译Python代码&…

十六、Docker Swarm的介绍和使用

一、Swarm简介 1、swarm介绍 Dockere Swarm是Docker公司推出的用来管理docker集群的编排工具&#xff0c;代码开源在https://github.com/docker/swarm&#xff0c; 它是将一群Docker宿主机变成一个单一的虚拟主机&#xff0c;提供了标准的 Docker API&#xff0c;所有任何已经与…

MySQL8超详细安装教程

MySQL的下载与安装 一、MySQL8下载 MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于大多数普通用户。 MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;不能在线下载&#x…

VUE——Vue CLI的原理与基本使用

摘要 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;提供&#xff1a; 通过 vue/cli 实现的交互式的项目脚手架。通过 vue/cli vue/cli-service-global 实现的零配置原型开发。一个运行时依赖 (vue/cli-service)&#xff0c;该依赖&#xff1a; 可升级&…

互联网企业更需要线上版的产品手册

互联网企业在不断发展变化的市场中&#xff0c;需要更加灵活和快速地适应市场需求&#xff0c;因此&#xff0c;线上版的产品手册对于互联网企业来说是非常重要的。 互联网企业更需要线上版的产品手册的原因 互联网用户更喜欢在线文档 互联网用户更喜欢在线文档&#xff0c;…

中创|没人比我更懂!马斯克发出警告:人类要小心人工智能

马斯克在过去十年对AI的态度一直非常鲜明&#xff0c;很早就对这个问题有深入地思考&#xff1a; 2014 “我们对AI要非常小心&#xff0c;这可能是我们最大的存在威胁。” 2016 “AI的未来发展方向可能并不乐观&#xff0c;起码不会所有结果都是好的。” 2017 “AI会比地…

中原银行 OLAP 架构实时化演进

中原银行 OLAP 架构实时化演进 1. OLAP 实时化建设背景2. OLAP 全链路实时化3. OLAP 实时化探索4. 未来探索方向 中原银行成立于 2014 年&#xff0c;是河南省唯一的省级法人银行&#xff0c;2017 年在香港联交所主板上市&#xff0c;2022 年 5 月经中国银保监会批准正式吸收合…

【问题解决】 网关代理Nginx 301暴露自身端口号

一般项目上常用Nginx做负载均衡和静态资源服务器&#xff0c;本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象&#xff0c;我们一起来看看。 “诡异”的现象 部署架构如下图&#xff0c;Nginx作为静态资源服务器监听8080端口&#xff0c;客户浏览器通过API网关…

跟晓月一起学:mysql中常用的命令汇总

前言 本文主要讲解了MySQL中常用的命令&#xff0c;感谢师父的耐心指导&#xff0c;师父博客&#xff1a;https://zmedu.blog.csdn.net 本文是对MySQL常用的两个命令的总结&#xff0c;一个是select &#xff0c;一个是show命令&#xff0c;很多时候我们监控MySQL需要监控MyS…

ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块

ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块 ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块 2、DCS的软件系统 DCS的软件体系如图2所示&#xff0c;通常可以为用户提供相当丰富的功能软件模块和功能软件包&#xff0c;控制工程师利用DCS提供的组态软件&…