Files
phs_v1.0.1.0/commonlibrary/c_utils/docs/zh-cn/c-utils-guide-safe_block_queue.md
2024-09-27 19:16:49 +08:00

5.2 KiB
Raw Blame History

线程安全阻塞队列

概述

简介

线程安全阻塞队列SafeBlockQueue类提供阻塞和非阻塞版的入队入队和出队接口并提供可最追踪任务完成状态的的SafeBlockQueueTracking类。

#include <safe_block_queue.h>

涉及功能

接口说明

OHOS::SafeBlockQueue

返回值 名称
SafeBlockQueue(int capacity)
构造函数
virtual ~SafeBlockQueue()
析构函数
void virtual Push(T const& elem)
入队操作(阻塞版)
bool virtual PushNoWait(T const& elem)
入队操作(非阻塞版)
T Pop()
出队操作(阻塞版)
bool PopNotWait(T& outtask)
出队操作(非阻塞版)
unsigned int Size()
获取队列容量
bool IsEmpty()
队列判空
bool IsFull()
队列判满

OHOS::SafeBlockQueueTracking

class SafeBlockQueueTracking : public SafeBlockQueue

返回值 名称
explicit SafeBlockQueueTracking(int capacity)
构造函数
virtual ~SafeBlockQueueTracking()
析构函数
void virtual Push(T const& elem)
入队操作(阻塞版)
bool virtual PushNoWait(T const& elem)
入队操作(非阻塞版)
bool OneTaskDone()
一个任务完成时的响应函数
void Join()
等待未完成队列
int GetUnfinishTaskNum()
获取未完成任务数

使用示例

  1. 示例代码(伪代码)
  • SafeBlockQueue的示例代码
#include <thread>
#include <functional>
#include <iostream>
#include "../include/safe_block_queue.h"

using namespace OHOS;
using namespace std;

constexpr int SIZE = 10;

class ProductsLine
{
public:
    ProductsLine(int maxSize) : que(maxSize) {}

    void Produce()
    {
        for (int i = 0; i < SIZE + 1; i++) {
            que.Push(i);
            cout << "Add " << i << " to the line" << endl;
        }
    }

    void Consume()
    {
        for (int i = 0; i < SIZE + 1; i++) {
            int out = que.Pop();
            cout << "Get " << out << " from the line" << endl;
        }
    }

    int remains()
    {
        return que.Size();
    }

private:
    SafeBlockQueue<int> que;
};

int main()
{
    ProductsLine line(SIZE);

    thread producer(bind(&ProductsLine::Produce, ref(line)));
    this_thread::sleep_for(chrono::milliseconds(1));

    thread consumer(bind(&ProductsLine::Consume, ref(line)));
    this_thread::sleep_for(chrono::milliseconds(1));

    producer.join();
    consumer.join();

    if (line.remains()==0) {
         cout << line.remains() << " elements remains in the queue. Synchronizing success." <<endl;
    }
}
  • SafeBlockQueueTracking的示例代码
#include <thread>
#include <functional>
#include <iostream>
#include "../include/safe_block_queue.h"

using namespace OHOS;
using namespace std;

constexpr int SIZE = 10;

class ProductsLine
{
public:
    ProductsLine(int maxSize) : que(maxSize) {}

    void Produce()
    {
        for (int i = 0; i < SIZE + 1; i++) {
            que.Push(i);
            cout << "Add " << i << " to the line" << endl;
        }
    }

    void Consume()
    {
        for (int i = 0; i < SIZE + 1; i++) {
            int out = que.Pop();
            cout << "Get " << out << " from the line" << endl;
            que.OneTaskDone();
        }
    }

    void Join()
    {
        que.Join();
    }

    int UnfinishTaskNum()
    {
        return que.GetUnfinishTaskNum();
    }

private:
    SafeBlockQueueTracking<int> que;
};

int main()
{
    ProductsLine line(SIZE);

    thread producer(bind(&ProductsLine::Produce, ref(line)));
    this_thread::sleep_for(chrono::milliseconds(1));

    thread consumer(bind(&ProductsLine::Consume, ref(line)));
    this_thread::sleep_for(chrono::milliseconds(1));

    line.Join();

    producer.join();
    consumer.join();

    if (line.UnfinishTaskNum()==0) {
         cout << line.UnfinishTaskNum() << " elements remains in the queue. Synchronizing success." <<endl;
    }
}
  1. 测试用例编译运行方法
  • 测试用例代码参见base/test/unittest/common/utils_safe_block_queue_test.cpp 和 base/test/unittest/common/utils_safe_block_queue_tracking.cpp

  • 使用开发者自测试框架,使用方法参见:开发自测试执行框架-测试用例执行

  • 使用以下具体命令以运行safe_block_queue.h对应测试用例

run -t UT -tp utils -ts UtilsSafeBlockQueueTest

# or

run -t UT -tp utils -ts UtilsSafeBlockQueueTrackingTest

常见问题