gpt4 book ai didi

c++ - 如何通过 C API 传递带捕获的 std::function?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:30 24 4
gpt4 key购买 nike

我有一个 C API,它是一个用于在线程之间传递消息的队列。我想通过 std::function<void()>通过它,但要做到这一点,我需要将其降级为固定长度的 POD 数据 block 。

std::function将主要来自 C++11 lambda 并将通过引用或复制捕获。我可以使用 C 队列两侧的堆。

队列本身是一个 FreeRTOS 队列,并且是嵌入式的。有一些 discussion about passing C++ish things through the queue在他们的论坛上。它主要是说如果它是 POD 或可以简单地构造就可以了。

目前我正在路过 struct { void (*fp)(void*); void* context; } , 并将其执行为 received.fp(received.context) ;但我希望在不牺牲更多资源的情况下在可读性方面做得更好。 (编辑:扩展了当前的使用和需求)

知道怎么做吗?

最佳答案

您可以将指针传递给您的 std::function<void()> .指针是 POD。您可以使用强制转换来入队/出队,并使用堆即新/删除来分配/取消分配。

但是,如果它是嵌入式的并且你有大量的这些消息(我会说每秒超过 100-1000 条消息),那么以这种方式强调内存管理器并不是一个好主意。如果是你的情况,我会重新处理消息,使它们不使用动态内存,为传输中的消息分配一个足够大小的池(如果你有 1 个消费者和 1 个生产者,足够的大小可能是 RTOS 队列长度+ 2),并在您的消费者线程[s]消费了一条消息后,使用一些东西将消息指针回收回池中。

不幸的是,这大大增加了复杂性。没有动态内存意味着没有 lambda,并且回收池需要是线程安全的。

关于c++ - 如何通过 C API 传递带捕获的 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com