【问题标题】:How to pass multiple arguments to spawned threads (Mbed)?如何将多个参数传递给生成的线程(Mbed)?
【发布时间】:2020-11-26 13:21:10
【问题描述】:

我使用 Mbed RTOS,我需要将多个参数传递给线程函数。

API 文档中有一个示例:

#include "mbed.h"

Thread thread;
DigitalOut led1(LED1);
volatile bool running = true;

// Blink function toggles the led in a long running loop
void blink(DigitalOut *led) {
    while (running) {
        *led = !*led;
        wait(1);
    }
}

// Spawns a thread to run blink for 5 seconds
int main() {
    thread.start(callback(blink, &led1));
    wait(5);
    running = false;
    thread.join();
}

但是只有一个参数可以通过。

有没有一种方便的方法来传递多个参数?我不喜欢将它们放入结构并传递结构的想法。但我看不到任何其他方法。

【问题讨论】:

  • 您可以使用std::tuple 而不是定义新的struct。但不太可能有任何其他方式,因为此类回调系统通常只提供一个“用户数据”指针。
  • 谢谢! std::tuple 肯定比 struct 这里好。

标签: c++ stm32 mbed


【解决方案1】:

您可以使用std::tuple<> 而不是定义新的struct。这在大多数情况下会更简单,尽管随着参数成员数量的增加,您可能会发现自己毕竟需要一个结构来获取它们的名称,而不是必须通过类型或索引来std::get()

不可能有任何其他方式,因为此类回调系统通常只提供一个“用户数据”指针,而我对 Mbed 的简短谷歌搜索表明它是相同的。

【讨论】:

  • 大部分 std::.... 在 uC 世界中不可用(包括元组)。它们太贵了。
  • @P__J__ 优化不会摆脱用于在内部实现std::tuple 的所有麻烦吗?
  • @P__J__ 不,我认为你保留了那个人的举证责任。
  • 你无法证明它。 C++ 库是用大型计算机编写的(即具有大量内存和计算能力)。在 uC 世界中,您的资源非常有限,RAM 远低于 1MB,并且计算能力有限。也必须不惜一切代价避免使用动态分配。元组在上面中继。假设你有 2kb 的堆。它会以多快的速度变得支离破碎?
  • @P__J__ 在什么世界,为什么,元组“依赖动态分配”?!?它们是直接保存每个元素的值类(通常通过递归继承 AFAIK)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多