目录

Function Flow Runtime串行队列(C++)

概述

FFRT串行队列基于协程调度模型实现,提供高效的消息队列功能,支持异步通信、流量削峰、无锁化状态和资源管理以及架构解耦等多种业务场景。FFRT串行队列支持以下功能:

示例:异步日志系统

举例实现一个异步日志系统,主线程将日志任务提交到队列,后台线程从队列中取出任务并写入文件。这种方式既能保证日志的顺序性,又能避免文件写入操作阻塞主线程。

借助FFRT并行化框架API,开发者只需专注于业务逻辑的实现,无需关注异步线程管理、线程安全及调度效率等问题。

用例简化了异常处理和线程安全相关的一些逻辑,实现代码如下所示:

#include <chrono>
#include <thread>
#include "hilog/log.h"
#include "ffrt/ffrt.h" // 来自 OpenHarmony 第三方库 "@ppd/ffrt"
#undef LOG_TAG
#define LOG_TAG "SerialCppTag"

class Logger {
public:
    Logger()
    {
        // 创建队列
        queue_ = std::make_unique<ffrt::queue>("loggerQueue");
        
        logFile_ = stdout;
        OH_LOG_INFO(LOG_APP, "Log file opened");
    }

    ~Logger()
    {
        // 销毁队列
        queue_ = nullptr;
        OH_LOG_INFO(LOG_APP, "Log file closed");
    }

    // 添加日志任务
    void Log(const std::string& message)
    {
        queue_->submit([this, message] {
            OH_LOG_INFO(LOG_APP, "Writing message %{public}s", message.c_str());
        });
    }

private:
    FILE *logFile_;
    std::unique_ptr<ffrt::queue> queue_;
};

int SerialQueueCppExec()
{
    Logger logger;

    // 主线程添加日志任务
    logger.Log("Log message 1");
    logger.Log("Log message 2");
    logger.Log("Log message 3");

    // 模拟主线程继续执行其他任务
    std::this_thread::sleep_for(std::chrono::seconds(1));

    return 0;
}

接口说明

上述样例中涉及到主要的FFRT的接口包括:

名称 描述
class queue 队列类。
sleep_for 延迟一定时间。
  • 如何使用FFRT C++ API详见:FFRT C++接口三方库使用指导。
  • 使用FFRT C接口或C++接口时,都可以通过FFRT C++接口三方库简化头文件包含,即使用#include "ffrt/ffrt.h"头文件包含语句。

约束限制