gpt4 book ai didi

c - Linux 上具有单独数据段的库的多个实例

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:45 26 4
gpt4 key购买 nike

我有一些 C 代码充满了全局变量,我需要将它们与我的项目链接在一起。这个外部项目是一个经常更新的实时项目,因此重写代码以使其对多实例更加友好并不是一个简单的选择。举一个具体的例子,假设我们有库代码(忽略不安全性!):

// foo.c
static char s_memory[256];
static int s_length;

void foo_init(char **mem)
{
*mem = s_memory;
}

void foo_calc(char *mem)
{
s_length = strlen(mem);
}

int foo_result()
{
return s_length;
}

用法如下:

// test_foo.c
char *data;
foo_init(&data);
strcpy(data, "Hello, world!");
foo_calc(data);
printf("%s is %d characters long!\n", data, foo_result());

这对于单线程实例工作正常,但我们的团队希望在多线程环境中运行它,显然这是非常错误的:

char *data1;
char *data2;
foo_init(&data1);
foo_init(&data2);
strcpy(data1, "Hello, world!");
strcpy(data2, "Goodbye cruel world!");
foo_calc(data1);
foo_calc(data2);
printf("%s and %s are %d and %d characters long!\n",
data1, data2, foo_result(), foo_result());

我希望我们能做的是:

char *data1;
char *data2;
FOO_HANDLE inst1 = new_instance("foo.so");
FOO_HANDLE inst2 = new_instance("foo.so");
inst1.foo_init(&data1);
inst2.foo_init(&data2);
strcpy(data1, "Hello, world!");
strcpy(data2, "Goodbye cruel world!");
inst1.foo_calc(data1);
inst2.foo_calc(data2);
printf("%s and %s are %d and %d characters long!\n",
data1, data2, inst1.foo_result(), inst2.foo_result());

如何实现这样的目标?

最佳答案

最简单的解决方案是将 _Thread_local(或 __thread)放在每个全局变量上,并从其自己的线程访问每个实例。

另一种可行的技巧是每次您需要一个新实例时都创建 .so 文件的新副本,然后dlopen。或者,您可以编写自己的 ELF 加载器,允许同一库的多个实例(并不像听起来那么难)。

虽然所有这些都是糟糕的 hack,您真的应该只修复代码以删除所有全局变量。

关于c - Linux 上具有单独数据段的库的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45294555/

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