ACE中TASK架构简介及简单应用(1)

该代码示例展示了如何在ACE框架下使用多线程和消息队列实现一个简单的生产者消费者模型。Counting_Test_Producer类作为生产者,将数据放入消息队列,而Counting_Test_Consumer类作为消费者,从队列中取出数据。当达到预设的最大消息数时,生产者会发送一个停止信号,消费者接收到后结束消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先配置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;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值