gpt4 book ai didi

c++ - 在软件中实现线程本地存储

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

我们正在将一个嵌入式应用程序从 Windows CE 移植到另一个系统。目前的处理器是STM32F4。我们当前的代码库大量使用 TLS。新原型(prototype)运行的是功能非常精简的 KEIL CMSIS RTOS。

关于 http://www.keil.com/support/man/docs/armcc/armcc_chr1359124216560.htm它说从 5.04 开始支持线程本地存储。现在我们正在使用 5.04。问题是当我们的程序与 __thread int a; 的变量定义链接时,链接器无法找到对我来说有意义的 __aeabi_read_tp

我的问题是:是否有可能实现 __aeabi_read_tp 并且它会起作用还是还有更多?

如果这对我们来说根本不可能:有没有办法只在软件中实现 TLS?我们暂时不谈性能。

编辑我尝试通过查看 freeBSD 的旧源代码和其他源代码来实现 __aeabi_read_tp。虽然该功能主要是在汇编中实现的,但我发现了一个 C 版本,归结为:

extern "C"
{
extern osThreadId svcThreadGetId(void);
void *__aeabi_read_tp()
{
return (void*)svcThreadGetId();
}
}

这基本上是为我提供当前正在执行的线程的 ID (void*)。如果我理解正确,那就是我们想要的。这可能行得通吗?

最佳答案

不考虑性能并且不进入 CMIS RTOS 细节(我不知道),你可以为你的变量分配所需的空间 - 无论是在堆上还是作为静态或全局变量 - 我建议有一个结构数组.然后,当您创建线程时,将指向下一个未使用结构的指针传递给您的线程函数。

在静态或全局变量的情况下,如果您知道有多少线程并行工作以限制预分配内存的大小,那将会很好。

编辑: 添加了基于 pthreads 的 TLS 实现示例:

#include <pthread.h>

#define MAX_PARALLEL_THREADS 10

static pthread_t threads[MAX_PARALLEL_THREADS];
static struct tls_data tls_data[MAX_PARALLEL_THREADS];
static int tls_data_free_index = 0;

static void *worker_thread(void *arg) {
static struct tls_data *data = (struct tls_data *) arg;

/* Code omitted. */
}

static int spawn_thread() {
if (tls_data_free_index >= MAX_PARALLEL_THREADS) {
// Consider increasing MAX_PARALLEL_THREADS
return -1;
}

/* Prepare thread data - code omitted. */

pthread_create(& threads[tls_data_free_index], NULL, worker_thread, & tls_data[tls_data_free_index]);
}

关于c++ - 在软件中实现线程本地存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31311724/

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