声明
typedef enum {
ffrt_dependence_data,
ffrt_dependence_task,
} ffrt_dependence_type_t;
typedef struct {
ffrt_dependence_type_t type;
const void* ptr;
} ffrt_dependence_t;
typedef struct {
uint32_t len;
const ffrt_dependence_t* items;
} ffrt_deps_t; 参数
描述
ffrt_dependence_t作用等同C++的dependence,ffrt_deps_t作用等同C++的std::vector<dependence>。
样例
// 创建数据依赖 int x = 0; ffrt_dependence_t data_dependence[1]; data_dependence[0].type = ffrt_dependence_data; data_dependence[0].ptr = &x; ffrt_deps_t data_deps; data_deps.len = 1; data_deps.items = data_dependence; // 创建任务依赖 ffrt_task_handle_t task = ffrt_submit_h_base(user_function_header, NULL, NULL, &attr); ffrt_dependence_t task_dependence[1]; task_dependence[0].type = ffrt_dependence_task; task_dependence[0].ptr = task; ffrt_deps_t task_deps; task_deps.len = 1; task_deps.items = task_dependence;
声明
typedef struct {
uint32_t storage[(ffrt_task_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_task_attr_t; 描述
任务的属性描述,在提交普通任务或者队列任务时,可以通过ffrt_task_attr_t来配置其属性。
方法
ffrt_task_attr_init
FFRT_C_API int ffrt_task_attr_init(ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_task_attr_destroy
FFRT_C_API void ffrt_task_attr_destroy(ffrt_task_attr_t* attr);
参数
描述
ffrt_task_attr_set_name
FFRT_C_API void ffrt_task_attr_set_name(ffrt_task_attr_t* attr, const char* name);
参数
描述
ffrt_task_attr_get_name
FFRT_C_API const char* ffrt_task_attr_get_name(const ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_task_attr_set_qos
FFRT_C_API void ffrt_task_attr_set_qos(ffrt_task_attr_t* attr, ffrt_qos_t qos);
参数
描述
ffrt_task_attr_get_qos
FFRT_C_API ffrt_qos_t ffrt_task_attr_get_qos(const ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_task_attr_set_delay
FFRT_C_API void ffrt_task_attr_set_delay(ffrt_task_attr_t* attr, uint64_t delay_us);
参数
描述
ffrt_task_attr_get_delay
FFRT_C_API uint64_t ffrt_task_attr_get_delay(const ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_task_attr_set_queue_priority
FFRT_C_API void ffrt_task_attr_set_queue_priority(ffrt_task_attr_t* attr, ffrt_queue_priority_t priority);
参数
描述
ffrt_task_attr_get_queue_priority
FFRT_C_API ffrt_queue_priority_t ffrt_task_attr_get_queue_priority(const ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_task_attr_set_stack_size
FFRT_C_API void ffrt_task_attr_set_stack_size(ffrt_task_attr_t* attr, uint64_t size);
参数
描述
ffrt_task_attr_get_stack_size
FFRT_C_API uint64_t ffrt_task_attr_get_stack_size(const ffrt_task_attr_t* attr);
参数
返回值
描述
样例
// 提交一个普通任务,其名称为"sample_task",QoS等级为background,调度时延为1ms,协程栈大小为2MB ffrt_task_attr_t attr; ffrt_task_attr_init(&attr); ffrt_task_attr_set_name(&attr, "sample_task"); ffrt_task_attr_set_qos(&attr, ffrt_qos_background); ffrt_task_attr_set_delay(&attr, 1000); ffrt_task_attr_set_stack_size(&attr, 2 * 1024 * 1024); ffrt_submit_base(user_function_header, NULL, NULL, &attr); ffrt_task_attr_destroy(&attr);
声明
typedef enum {
ffrt_function_kind_general,
ffrt_function_kind_queue,
} ffrt_function_kind_t;
typedef void(*ffrt_function_t)(void*);
typedef struct {
ffrt_function_t exec;
ffrt_function_t destroy;
uint64_t reserve[2];
} ffrt_function_header_t;
FFRT_C_API void *ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_t kind); 参数
返回值
描述
分配了一块内存空间,内存空间头部为ffrt_function_header_t结构体(返回指针可转换为ffrt_function_header_t*指针使用)。头部后留有64字节的可用空间,用户可自定义使用该空间,通常用于入参或返回值的存储。
样例
样例1:生成一个不带参数和返回值的任务执行体:
#include <stdio.h>
#include "ffrt/task.h"
void foo(void* data)
{
printf("foo\n");
}
void after_foo(void* data)
{
printf("after_foo\n");
}
int main()
{
ffrt_function_header_t* func = (ffrt_function_header_t*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func->exec = foo;
func->destroy = after_foo;
ffrt_submit_base(func, NULL, NULL, NULL);
ffrt_wait();
return 0;
} 样例2:生成一个带参数和返回值的任务执行体:
#include <stdio.h>
#include "ffrt/task.h"
int foo(int x, int y)
{
printf("foo: x = %d, y = %d\n", x, y);
return x + y;
}
void after_foo(void* data)
{
printf("after_foo\n");
}
// 用户自定义任务执行体,可携带参数和返回值
typedef struct {
ffrt_function_header_t header; // 头部内存为ffrt_function_header_t
int arg1; // 参数1
int arg2; // 参数2
int ret; // 返回值
} user_defined_function;
// 将foo包装成void(*)(void*)的exec函数类型
void exec_func_wrapper(void* header)
{
user_defined_function* func = (user_defined_function*)header;
func->ret = foo(func->arg1, func->arg2); // 内部展开真正的foo函数,传递参数,获取返回值
}
int main()
{
user_defined_function* func = (user_defined_function*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func->header.exec = exec_func_wrapper;
func->header.destroy = after_foo;
func->arg1 = 1;
func->arg2 = 2;
ffrt_submit_base((ffrt_function_header_t*)func, NULL, NULL, NULL);
ffrt_wait();
printf("ret = %d\n", func->ret);
return 0;
} 声明
FFRT_C_API void ffrt_submit_base(ffrt_function_header_t* f, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);
参数
描述
提交一个普通任务,任务支持相关属性设置,在输入依赖解除后任务可调度执行,任务执行完成后解除输出依赖。
样例
样例1:提交带属性的任务:
#include <stdio.h>
#include "ffrt/task.h"
void foo(void* data)
{
printf("foo\n");
}
void after_foo(void* data)
{
printf("after_foo\n");
}
int main()
{
// 提交一个任务
ffrt_function_header_t* func = (ffrt_function_header_t*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func->exec = foo;
func->destroy = after_foo;
ffrt_submit_base(func, NULL, NULL, NULL);
// 提交一个带属性的任务
ffrt_task_attr_t attr;
ffrt_task_attr_init(&attr);
ffrt_task_attr_set_name(&attr, "sample_task");
ffrt_task_attr_set_qos(&attr, ffrt_qos_background);
ffrt_submit_base(func, NULL, NULL, &attr);
return 0;
} 样例2:提交带数据依赖的任务:
// 提交两个带数据依赖的任务,任务间存在Read-After-Write依赖关系
#include <math.h>
#include <stdio.h>
#include "ffrt/task.h"
void cos_func(float* x, float* y)
{
*y = cos(*x);
}
void tan_func(float* y, float* z)
{
*z = tan(*y);
}
typedef struct {
ffrt_function_header_t header;
float* arg1; // 参数1
float* arg2; // 参数2
} user_defined_function;
void cos_func_wrapper(void* header)
{
user_defined_function* func = (user_defined_function*)header;
cos_func(func->arg1, func->arg2);
}
void tan_func_wrapper(void* header)
{
user_defined_function* func = (user_defined_function*)header;
tan_func(func->arg1, func->arg2);
}
void destroy(void* header) {}
int main()
{
float x = 0.5f, y, z;
user_defined_function* func1 = (user_defined_function*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func1->header.exec = cos_func_wrapper;
func1->header.destroy = destroy;
func1->arg1 = &x;
func1->arg2 = &y;
user_defined_function* func2 = (user_defined_function*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func2->header.exec = tan_func_wrapper;
func2->header.destroy = destroy;
func2->arg1 = &y;
func2->arg2 = &z;
ffrt_dependence_t dependence_x[1];
dependence_x[0].type = ffrt_dependence_data;
dependence_x[0].ptr = &x;
ffrt_deps_t deps_x;
deps_x.len = 1;
deps_x.items = dependence_x;
ffrt_dependence_t dependence_y[1];
dependence_y[0].type = ffrt_dependence_data;
dependence_y[0].ptr = &y;
ffrt_deps_t deps_y;
deps_y.len = 1;
deps_y.items = dependence_y;
ffrt_dependence_t dependence_z[1];
dependence_z[0].type = ffrt_dependence_data;
dependence_z[0].ptr = &z;
ffrt_deps_t deps_z;
deps_z.len = 1;
deps_z.items = dependence_z;
ffrt_submit_base((ffrt_function_header_t*)func1, &deps_x, &deps_y, NULL);
ffrt_submit_base((ffrt_function_header_t*)func2, &deps_y, &deps_z, NULL);
ffrt_wait();
printf("x = %f, y = %f, z = %f\n", x, y, z);
return 0;
} 声明
FFRT_C_API void ffrt_submit_f(ffrt_function_t func, void* arg, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);
参数
描述
ffrt_submit_f接口是ffrt_submit_base接口的简化包装形式。当任务不需要销毁回调函数时,接口内部将任务函数及其参数包装成通用任务结构,再调用ffrt_submit_base接口提交任务。
从API version 20开始,支持该接口。
样例
#include <stdio.h>
#include "ffrt/task.h"
// 待提交执行的函数
void OnePlusForTest(void* arg)
{
(*static_cast<int*>(arg)) += 1;
}
int main()
{
int a = 0;
ffrt_submit_f(OnePlusForTest, &a, NULL, NULL, NULL);
ffrt_wait();
printf("a = %d\n", a);
return 0;
} 声明
typedef void* ffrt_task_handle_t; FFRT_C_API ffrt_task_handle_t ffrt_submit_h_base(ffrt_function_header_t* f, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);
参数
返回值
描述
相比于ffrt_submit_base接口,增加了任务句柄的返回值。
样例
// 提交一个任务,获取任务句柄 ffrt_function_header_t* func = (ffrt_function_header_t*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general); func->exec = foo; func->destroy = after_foo; ffrt_task_handle_t t = ffrt_submit_h_base(func, NULL, NULL, NULL); // 注意C API的ffrt_task_handle_t需要用户调用ffrt_task_handle_destroy显式销毁 ffrt_task_handle_destroy(t);
声明
typedef void* ffrt_task_handle_t; FFRT_C_API ffrt_task_handle_t ffrt_submit_h_f(ffrt_function_t func, void* arg, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);
参数
返回值
描述
相比于ffrt_submit_f接口,增加了任务句柄的返回值。
从API version 20开始,支持该接口。
样例
#include <stdio.h>
#include <vector>
#include "ffrt/task.h"
// 待提交执行的函数
void OnePlusForTest(void* arg)
{
(*static_cast<int*>(arg)) += 1;
}
int main()
{
int a = 0;
ffrt_task_handle_t task = ffrt_submit_h_f(OnePlusForTest, &a, NULL, NULL, NULL);
const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
ffrt_wait_deps(&wait);
printf("a = %d\n", a);
return 0;
} 声明
FFRT_C_API uint32_t ffrt_task_handle_inc_ref(ffrt_task_handle_t handle);
参数
返回值
描述
通过任务句柄增加对应任务的引用计数,每次调用引用计数加一。用于控制任务的生命周期使用,当引用计数不为零时,对应的任务资源不会被释放。注意ffrt_submit_h_base返回的ffrt_task_handle_t默认已有一个引用计数。通过ffrt_task_handle_destroy销毁ffrt_task_handle_t时默认减去一个引用计数。
声明
FFRT_C_API uint32_t ffrt_task_handle_dec_ref(ffrt_task_handle_t handle);
参数
返回值
描述
通过任务句柄减去对应任务的引用计数,每次调用引用计数减一。
声明
FFRT_C_API void ffrt_task_handle_destroy(ffrt_task_handle_t handle);
参数
描述
销毁任务句柄,同时默认减去一个任务引用计数。
声明
FFRT_C_API void ffrt_wait(void);
描述
同步等待所有前序提交的同级任务完成。
样例
// 同步三个任务完成 ffrt_submit_base(func1, NULL, NULL, NULL); ffrt_submit_base(func2, NULL, NULL, NULL); ffrt_submit_base(func3, NULL, NULL, NULL); ffrt_wait();
声明
FFRT_C_API void ffrt_wait_deps(const ffrt_deps_t* deps);
参数
描述
同步对应的数据依赖解除。
样例
// 构建x的数据依赖 int x = 0; ffrt_dependence_t dependence[1]; dependence[0].type = ffrt_dependence_data; dependence[0].ptr = &x; ffrt_deps_t deps; deps.len = 1; deps.items = dependence; // 提交一个写任务 ffrt_submit_base(func, NULL, &deps, NULL); // 同步写任务解除数据依赖 ffrt_wait_deps(&deps);
声明
FFRT_C_API int ffrt_this_task_update_qos(ffrt_qos_t qos);
参数
返回值
描述
在任务执行过程中,动态修改任务的QoS等级。注意该接口在任务的函数闭包内使用,修改的是当前正在执行的任务的QoS等级,接口调用会使任务先挂起一次再恢复执行。
样例
// 一个qos_background的任务执行过程中动态修改QoS等级
ffrt::submit([]() {
// ...
int ret = ffrt_this_task_update_qos(ffrt_qos_user_initiated);
// ...
}, ffrt::task_attr().qos(ffrt::qos_background)); 声明
FFRT_C_API ffrt_qos_t ffrt_this_task_get_qos(void);
返回值
描述
获取当前正在执行任务的QoS等级。
样例
// 一个任务执行过程中动态获取其QoS等级
ffrt::submit([]() {
// ...
// 获取的qos等于ffrt_qos_background
ffrt_qos_t qos = ffrt_this_task_get_qos();
// ...
}, ffrt::task_attr().qos(ffrt::qos_background)); 声明
FFRT_C_API uint64_t ffrt_this_task_get_id(void);
返回值
描述
获取当前正在执行任务的id。
样例
// 一个任务执行过程中动态获取其任务id
ffrt::submit([]() {
// ...
// 获取的唯一任务id
uint64_t task_id = ffrt_this_task_get_id();
// ...
}, ffrt::task_attr().qos(ffrt::qos_background)); 声明
typedef struct {
uint32_t storage[(ffrt_queue_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_queue_attr_t; 描述
用于配置队列的属性,如 QoS、超时时间、回调函数和最大并发数。
方法
ffrt_queue_attr_init
int ffrt_queue_attr_init(ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_attr_destroy
void ffrt_queue_attr_destroy(ffrt_queue_attr_t* attr);
参数
描述
ffrt_queue_attr_set_qos
void ffrt_queue_attr_set_qos(ffrt_queue_attr_t* attr, ffrt_qos_t qos);
参数
描述
ffrt_queue_attr_get_qos
ffrt_qos_t ffrt_queue_attr_get_qos(const ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_attr_set_timeout
void ffrt_queue_attr_set_timeout(ffrt_queue_attr_t* attr, uint64_t timeout_us);
参数
描述
ffrt_queue_attr_get_timeout
uint64_t ffrt_queue_attr_get_timeout(const ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_attr_set_callback
void ffrt_queue_attr_set_callback(ffrt_queue_attr_t* attr, ffrt_function_header_t* f);
参数
描述
ffrt_queue_attr_get_callback
ffrt_function_header_t* ffrt_queue_attr_get_callback(const ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_attr_set_max_concurrency
void ffrt_queue_attr_set_max_concurrency(ffrt_queue_attr_t* attr, const int max_concurrency);
参数
描述
ffrt_queue_attr_get_max_concurrency
int ffrt_queue_attr_get_max_concurrency(const ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_attr_set_thread_mode
void ffrt_queue_attr_set_thread_mode(ffrt_queue_attr_t* attr, bool mode);
参数
描述
从API version 20开始,支持该接口。
ffrt_queue_attr_get_thread_mode
bool ffrt_queue_attr_get_thread_mode(const ffrt_queue_attr_t* attr);
参数
返回值
描述
从API version 20开始,支持该接口。
样例
#include <functional>
#include "ffrt/queue.h"
#include "ffrt/cpp/task.h"
int main()
{
ffrt_queue_attr_t queue_attr;
// 初始化队列属性,必需
ffrt_queue_attr_init(&queue_attr);
ffrt_queue_attr_set_qos(&queue_attr, static_cast<int>(ffrt_qos_utility));
ffrt_queue_attr_set_timeout(&queue_attr, 10000);
int x = 0;
std::function<void()>&& basicFunc = [&x]() { x += 1; };
ffrt_function_header_t* func = ffrt_queue_attr_get_callback(&queue_attr);
ffrt_queue_attr_set_callback(&queue_attr, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue));
// 销毁队列属性,必需
ffrt_queue_attr_destroy(&queue_attr);
return 0;
} 声明
typedef void* ffrt_queue_t;
描述
队列指针,提供一系列C接口支持队列任务的提交、取消、等待和排队任务数量查询。
方法
ffrt_queue_create
ffrt_queue_t ffrt_queue_create(ffrt_queue_type_t type, const char* name, const ffrt_queue_attr_t* attr);
参数
返回值
描述
ffrt_queue_destroy
void ffrt_queue_destroy(ffrt_queue_t queue);
参数
描述
ffrt_queue_submit
void ffrt_queue_submit(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);
参数
描述
ffrt_queue_submit_f
void ffrt_queue_submit_f(ffrt_queue_t queue, ffrt_function_t func, void* arg, const ffrt_task_attr_t* attr);
参数
描述
从API version 20开始,支持该接口。
ffrt_queue_submit_h
ffrt_task_handle_t ffrt_queue_submit_h(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);
参数
返回值
描述
ffrt_queue_submit_h_f
ffrt_task_handle_t ffrt_queue_submit_h_f(ffrt_queue_t queue, ffrt_function_t func, void* arg, const ffrt_task_attr_t* attr);
参数
返回值
描述
从API version 20开始,支持该接口。
ffrt_queue_wait
void ffrt_queue_wait(ffrt_task_handle_t handle);
参数
描述
ffrt_queue_cancel
int ffrt_queue_cancel(ffrt_task_handle_t handle);
参数
返回值
描述
ffrt_get_main_queue
ffrt_queue_t ffrt_get_main_queue();
返回值
描述
ffrt_get_current_queue
ffrt_queue_t ffrt_get_current_queue();
返回值
描述
样例
#include "ffrt/queue.h"
#include "ffrt/cpp/task.h"
int main()
{
ffrt_queue_attr_t queue_attr;
// 1、初始化队列属性,必需
(void)ffrt_queue_attr_init(&queue_attr);
// 2、创建串行队列,并返回队列句柄queue_handle
ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
int result = 0;
std::function<void()>&& basicFunc = [&result]() { result += 1; };
// 3、提交串行任务
ffrt_queue_submit(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
// 4、提交串行任务,并返回任务句柄
ffrt_task_handle_t t1 = ffrt_queue_submit_h(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
// 5、等待指定任务执行完成
ffrt_queue_wait(t1);
ffrt_task_handle_t t2 = ffrt_queue_submit_h(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
// 6、取消句柄为 t2 的任务
ffrt_queue_cancel(t2);
// 7、销毁提交给串行队列任务的句柄 t1 和 t2,必需
ffrt_task_handle_destroy(t1);
ffrt_task_handle_destroy(t2);
// 8、销毁队列属性,必需
ffrt_queue_attr_destroy(&queue_attr);
// 9、销毁队列句柄,必需
ffrt_queue_destroy(queue_handle);
return 0;
} 声明
typedef enum {
ffrt_error = -1,
ffrt_success = 0,
ffrt_error_nomem = ENOMEM,
ffrt_error_timedout = ETIMEDOUT,
ffrt_error_busy = EBUSY,
ffrt_error_inval = EINVAL
} ffrt_error_t;
typedef enum {
ffrt_mutex_normal = 0,
ffrt_mutex_recursive = 2,
ffrt_mutex_default = ffrt_mutex_normal
} ffrt_mutex_type;
struct ffrt_mutexattr_t;
int ffrt_mutexattr_init(ffrt_mutexattr_t* attr);
int ffrt_mutexattr_settype(ffrt_mutexattr_t* attr, int type);
int ffrt_mutexattr_gettype(ffrt_mutexattr_t* attr, int* type);
int ffrt_mutexattr_destroy(ffrt_mutexattr_t* attr); 描述
方法
ffrt_mutexattr_init
FFRT_C_API int ffrt_mutexattr_init(ffrt_mutexattr_t* attr);
参数
返回值
描述
ffrt_mutexattr_destroy
FFRT_C_API int ffrt_mutexattr_destroy(ffrt_mutexattr_t* attr);
参数
返回值
描述
ffrt_mutexattr_settype
FFRT_C_API int ffrt_mutexattr_settype(ffrt_mutexattr_t* attr, int type);
参数
返回值
描述
ffrt_mutexattr_gettype
FFRT_C_API int ffrt_mutexattr_gettype(ffrt_mutexattr_t* attr, int* type);
参数
返回值
描述
样例
ffrt_mutexattr_t attr; // 初始化锁属性 ffrt_mutexattr_init(&attr); // 设置为互斥锁 ffrt_mutexattr_settype(&attr, ffrt_mutex_normal); // 设置为递归锁 ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive); // 获取锁类型 int type = ffrt_mutex_default; ffrt_mutexattr_gettype(&attr, &type); // 销毁锁属性 ffrt_mutexattr_destroy(&attr);
声明
struct ffrt_mutex_t; struct ffrt_mutexattr_t; int ffrt_mutex_init(ffrt_mutex_t* mutex, const ffrt_mutexattr_t* attr); int ffrt_mutex_lock(ffrt_mutex_t* mutex); int ffrt_mutex_unlock(ffrt_mutex_t* mutex); int ffrt_mutex_trylock(ffrt_mutex_t* mutex); int ffrt_mutex_destroy(ffrt_mutex_t* mutex);
描述
方法
ffrt_mutex_init
FFRT_C_API int ffrt_mutex_init(ffrt_mutex_t* mutex, const ffrt_mutexattr_t* attr);
参数
返回值
描述
ffrt_mutex_destroy
FFRT_C_API int ffrt_mutex_destroy(ffrt_mutex_t* mutex);
参数
返回值
描述
ffrt_mutex_lock
FFRT_C_API int ffrt_mutex_lock(ffrt_mutex_t* mutex);
参数
返回值
描述
ffrt_mutex_unlock
FFRT_C_API int ffrt_mutex_unlock(ffrt_mutex_t* mutex);
参数
返回值
描述
ffrt_mutex_trylock
FFRT_C_API int ffrt_mutex_trylock(ffrt_mutex_t* mutex);
参数
返回值
描述
样例
#include "ffrt/mutex.h"
#include "ffrt/cpp/task.h"
int main()
{
ffrt_mutexattr_t attr;
ffrt_mutex_t lock;
int sum = 0;
int type = ffrt_mutex_default;
ffrt_mutexattr_init(&attr);
ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive);
ffrt_mutexattr_gettype(&attr, &type);
ffrt_mutex_init(&lock, &attr);
ffrt::submit([&]() {
ffrt_mutex_lock(&lock);
ffrt_mutex_trylock(&lock);
sum++;
ffrt_mutex_lock(&lock);
ffrt_mutex_trylock(&lock);
sum++;
ffrt_mutex_unlock(&lock);
ffrt_mutex_unlock(&lock);
ffrt_mutex_unlock(&lock);
ffrt_mutex_unlock(&lock);
}, {}, {});
ffrt::wait();
ffrt_mutexattr_destroy(&attr);
ffrt_mutex_destroy(&lock);
return 0;
} 声明
struct ffrt_rwlock_t; struct ffrt_rwlockattr_t; int ffrt_rwlock_init(ffrt_rwlock_t* rwlock, const ffrt_rwlockattr_t* attr); int ffrt_rwlock_wrlock(ffrt_rwlock_t* rwlock); int ffrt_rwlock_rdlock(ffrt_rwlock_t* rwlock); int ffrt_rwlock_trywrlock(ffrt_rwlock_t* rwlock); int ffrt_rwlock_tryrdlock(ffrt_rwlock_t* rwlock); int ffrt_rwlock_unlock(ffrt_rwlock_t* rwlock); int ffrt_rwlock_destroy(ffrt_rwlock_t* rwlock);
描述
方法
ffrt_rwlock_init
FFRT_C_API int ffrt_rwlock_init(ffrt_rwlock_t* rwlock, const ffrt_rwlockattr_t* attr);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_wrlock
FFRT_C_API int ffrt_rwlock_wrlock(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_rdlock
FFRT_C_API int ffrt_rwlock_rdlock(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_trywrlock
FFRT_C_API int ffrt_rwlock_trywrlock(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_tryrdlock
FFRT_C_API int ffrt_rwlock_tryrdlock(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_unlock
FFRT_C_API int ffrt_rwlock_unlock(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
ffrt_rwlock_destroy
FFRT_C_API int ffrt_rwlock_destroy(ffrt_rwlock_t* rwlock);
参数
返回值
描述
从API version 18开始,支持该接口。
样例
#include "ffrt/shared_mutex.h"
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"
int main()
{
ffrt_rwlock_t rwlock;
int x = 0;
ffrt_rwlock_init(&rwlock, nullptr);
ffrt::submit([&]() {
ffrt_rwlock_wrlock(&rwlock);
ffrt_usleep(10);
x++;
ffrt_rwlock_unlock(&rwlock);
},{},{});
ffrt::submit([&]() {
ffrt_usleep(2);
ffrt_rwlock_rdlock(&rwlock);
ffrt_rwlock_unlock(&rwlock);
},{},{});
ffrt::submit([&]() {
ffrt_usleep(2);
if(ffrt_rwlock_trywrlock(&rwlock) == ffrt_success){
x++;
ffrt_rwlock_unlock(&rwlock);
}
},{},{});
ffrt::submit([&]() {
ffrt_usleep(2);
if(ffrt_rwlock_tryrdlock(&rwlock) == ffrt_success){
ffrt_rwlock_unlock(&rwlock);
}
},{},{});
ffrt::wait();
ffrt_rwlock_destroy(&rwlock);
return 0;
} 声明
typedef enum {
ffrt_error = -1,
ffrt_success = 0,
ffrt_error_nomem = ENOMEM,
ffrt_error_timedout = ETIMEDOUT,
ffrt_error_busy = EBUSY,
ffrt_error_inval = EINVAL
} ffrt_error_t;
typedef struct {
uint32_t storage[(ffrt_cond_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_cond_t;
int ffrt_cond_init(ffrt_cond_t* cond, const ffrt_condattr_t* attr);
int ffrt_cond_signal(ffrt_cond_t* cond);
int ffrt_cond_broadcast(ffrt_cond_t* cond);
int ffrt_cond_wait(ffrt_cond_t*cond, ffrt_mutex_t* mutex);
int ffrt_cond_timedwait(ffrt_cond_t* cond, ffrt_mutex_t* mutex, const struct timespec* time_point);
int ffrt_cond_destroy(ffrt_cond_t* cond); 描述
方法
ffrt_cond_init
FFRT_C_API int ffrt_cond_init(ffrt_cond_t* cond, const ffrt_condattr_t* attr);
参数
返回值
描述
ffrt_cond_destroy
FFRT_C_API int ffrt_cond_destroy(ffrt_cond_t* cond);
参数
返回值
描述
ffrt_cond_signal
FFRT_C_API int ffrt_cond_signal(ffrt_cond_t* cond);
参数
返回值
描述
ffrt_cond_broadcast
FFRT_C_API int ffrt_cond_broadcast(ffrt_cond_t* cond);
参数
返回值
描述
ffrt_cond_wait
FFRT_C_API int ffrt_cond_wait(ffrt_cond_t* cond, ffrt_mutex_t* mutex);
参数
返回值
描述
ffrt_cond_timedwait
FFRT_C_API int ffrt_cond_timedwait(ffrt_cond_t* cond, ffrt_mutex_t* mutex, const struct timespec* time_point);
参数
返回值
描述
样例
#include <iostream>
#include "ffrt/condition_variable.h"
#include "ffrt/mutex.h"
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"
struct timespec timeoutms_to_tm(int timeout_ms) {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += timeout_ms / 1000;
ts.tv_nsec += (timeout_ms % 1000) * 1000000;
if (ts.tv_nsec >= 1000000000) {
ts.tv_sec += 1;
ts.tv_nsec -= 1000000000;
}
return ts;
}
int main()
{
int a = 0;
ffrt_cond_t cond;
ffrt_mutex_t lock_;
ffrt_cond_init(&cond, nullptr);
ffrt_mutex_init(&lock_, nullptr);
for (int i = 0; i < 3; i++) {
ffrt::submit([&]() {
int timeout = 2000;
struct timespec tm = timeoutms_to_tm(timeout);
ffrt_mutex_lock(&lock_);
auto start = std::chrono::high_resolution_clock::now();
ffrt_cond_timedwait(&cond, &lock_, &tm);
auto end = std::chrono::high_resolution_clock::now();
a = 123;
ffrt_mutex_unlock(&lock_);
std::chrono::duration<double, std::milli> elapsed = end - start;
double t = elapsed.count();
std::cout << "ffrt_cond_timedwait " << t << " ms" << std::endl;
}, {}, {});
}
ffrt::submit([&]() {
ffrt_usleep(1000 * 1000);
ffrt_mutex_lock(&lock_);
a = 5;
ffrt_cond_broadcast(&cond);
ffrt_mutex_unlock(&lock_);
}, {}, {});
ffrt::wait();
ffrt_cond_destroy(&cond);
ffrt_mutex_destroy(&lock_);
return 0;
} 声明
FFRT_C_API int ffrt_usleep(uint64_t usec);
参数
描述
样例
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"
int main()
{
ffrt::submit([=]() { ffrt_usleep(10); }, {}, {});
ffrt::wait();
return 0;
} 声明
FFRT_C_API void ffrt_yield();
描述
样例
#include <iostream>
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"
int main()
{
int count = 12;
for (int i = 0; i < count; i++) {
ffrt::submit([&]() {
ffrt_usleep(100);
std::cout << "test" << std::endl;
ffrt_yield();
}, {}, {});
}
ffrt::wait();
return 0;
} 声明
typedef int ffrt_timer_t; typedef void (*ffrt_timer_cb)(void* data);
描述
提供定时器相关的功能。
方法
ffrt_timer_start
声明
FFRT_C_API ffrt_timer_t ffrt_timer_start(ffrt_qos_t qos, uint64_t timeout, void* data, ffrt_timer_cb cb, bool repeat);
参数
返回值
描述
ffrt_timer_stop
声明
FFRT_C_API int ffrt_timer_stop(ffrt_qos_t qos, ffrt_timer_t handle);
参数
返回值
描述
样例
样例1:使用单次定时器:
#include <stdio.h>
#include <unistd.h>
#include "ffrt/timer.h"
static void test_fun(void *data)
{
*(int *)data += 1;
}
void (*cb)(void *) = test_fun;
int main()
{
static int x = 0;
void *data = &x;
uint64_t timeout = 200;
// 启动定时器,在200ms后执行回调函数
int handle = ffrt_timer_start(ffrt_qos_default, timeout, data, cb, false);
usleep(300000);
// 定时器已经执行,取消无效
ffrt_timer_stop(ffrt_qos_default, handle);
printf("data: %d\n", x); // x值变成1
return 0;
} 样例2:使用循环定时器:
#include <stdio.h>
#include <unistd.h>
#include "ffrt/timer.h"
static void test_fun(void *data)
{
*(int *)data += 1;
}
void (*cb)(void *) = test_fun;
int main()
{
static int x = 0;
void *data = &x;
uint64_t timeout = 200;
// 启动循环定时器,每间隔200ms执行回调函数
int handle = ffrt_timer_start(ffrt_qos_default, timeout, data, cb, true);
usleep(500000);
// 取消循环定时器
ffrt_timer_stop(ffrt_qos_default, handle);
printf("data: %d\n", x); // x的值变成2
return 0;
} 声明
typedef void* ffrt_loop_t;
描述
提供循环相关的功能。
方法
ffrt_loop_create
声明
FFRT_C_API ffrt_loop_t ffrt_loop_create(ffrt_queue_t queue);
参数
返回值
描述
ffrt_loop_destroy
声明
FFRT_C_API int ffrt_loop_destroy(ffrt_loop_t loop);
参数
返回值
描述
ffrt_loop_run
声明
FFRT_C_API int ffrt_loop_run(ffrt_loop_t loop);
参数
返回值
描述
ffrt_loop_stop
声明
FFRT_C_API void ffrt_loop_stop(ffrt_loop_t loop);
参数
描述
ffrt_loop_epoll_ctl
声明
int ffrt_loop_epoll_ctl(ffrt_loop_t loop, int op, int fd, uint32_t events, void *data, ffrt_poller_cb cb)
参数
返回值
描述
ffrt_loop_timer_start
声明
FFRT_C_API ffrt_timer_t ffrt_loop_timer_start(ffrt_loop_t loop, uint64_t timeout, void* data, ffrt_timer_cb cb, bool repeat);
参数
返回值
描述
ffrt_loop_timer_stop
声明
FFRT_C_API int ffrt_loop_timer_stop(ffrt_loop_t loop, ffrt_timer_t handle);
参数
返回值
描述
样例
样例1:循环与并发队列:
#include <pthread.h>
#include <stdio.h>
#include "ffrt/loop.h"
void* ThreadFunc(void* p)
{
int ret = ffrt_loop_run(p);
if (ret == 0) {
printf("loop normal operation.");
}
return NULL;
}
int main()
{
// 创建并发队列
ffrt_queue_attr_t queue_attr;
(void)ffrt_queue_attr_init(&queue_attr);
ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
// 创建loop
ffrt_loop_t loop = ffrt_loop_create(queue_handle);
// 启动独立线程来执行loop
pthread_t thread;
int ret = pthread_create(&thread, 0, ThreadFunc, loop);
if (ret != 0) {
printf("pthread_create failed!");
ffrt_loop_destroy(loop);
ffrt_queue_attr_destroy(&queue_attr);
ffrt_queue_destroy(queue_handle);
return 0;
}
// 终止并销毁loop
ffrt_loop_stop(loop);
ffrt_loop_destroy(loop);
// 销毁并发队列
ffrt_queue_attr_destroy(&queue_attr);
ffrt_queue_destroy(queue_handle);
return 0;
} 样例2:循环、并发队列和定时器:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <functional>
#include <sys/epoll.h>
#include <sys/eventfd.h>
#include "ffrt/loop.h"
#include "ffrt/cpp/task.h"
void* ThreadFunc(void* p)
{
ffrt_loop_run(p);
return nullptr;
}
static void test_fun(void* data)
{
*(int*)data += 1;
}
static void (*cb)(void*) = test_fun;
void testCallBack(void *data, unsigned int events) {}
struct TestData {
int fd;
uint64_t expected;
};
int main()
{
// 创建并发队列
ffrt_queue_attr_t queue_attr;
(void)ffrt_queue_attr_init(&queue_attr);
ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
// 创建loop
auto loop = ffrt_loop_create(queue_handle);
int result1 = 0;
// 向loop队列提交一个任务
std::function<void()> &&basicFunc1 = [&result1]() { result1 += 10; };
ffrt_task_handle_t task = ffrt_queue_submit_h(queue_handle, ffrt::create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
// 启动独立线程来执行loop
pthread_t thread;
int ret = pthread_create(&thread, 0, ThreadFunc, loop);
if (ret != 0) {
printf("pthread_create failed!");
ffrt_loop_destroy(loop);
ffrt_queue_attr_destroy(&queue_attr);
ffrt_queue_destroy(queue_handle);
return 0;
}
static int x = 0;
int* xf = &x;
void* data = xf;
uint64_t timeout1 = 20;
uint64_t timeout2 = 10;
uint64_t expected = 0xabacadae;
int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
struct TestData testData {.fd = testFd, .expected = expected};
// 向loop注册一个定时器
ffrt_timer_t timeHandle = ffrt_loop_timer_start(loop, timeout1, data, cb, false);
// 向loop注册一个fd监听
int ret = ffrt_loop_epoll_ctl(loop, EPOLL_CTL_ADD, testFd, EPOLLIN, (void*)(&testData), testCallBack);
if (ret == 0) {
printf("ffrt_loop_epoll_ctl执行成功。\n");
}
ssize_t n = write(testFd, &expected, sizeof(uint64_t));
usleep(25000);
// 删除fd监听
ffrt_loop_epoll_ctl(loop, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr);
// 终止loop
ffrt_loop_stop(loop);
pthread_join(thread, nullptr);
// 删除定时器
ffrt_loop_timer_stop(loop, timeHandle);
// 销毁loop
ret = ffrt_loop_destroy(loop);
// 销毁并发队列
ffrt_queue_attr_destroy(&queue_attr);
ffrt_queue_destroy(queue_handle);
return 0;
} 声明
struct ffrt_fiber_t;
描述
方法
ffrt_fiber_init
声明
FFRT_C_API int ffrt_fiber_init(ffrt_fiber_t* fiber, void(*func)(void*), void* arg, void* stack, size_t stack_size);
参数
返回值
描述
从API version 20开始,支持该接口。
ffrt_fiber_switch
声明
FFRT_C_API void ffrt_fiber_switch(ffrt_fiber_t* from, ffrt_fiber_t* to);
参数
描述
从API version 20开始,支持该接口。