我有一些C代码充满了全局变量,我需要将其与我的项目链接在一起。这个外部项目是一个频繁更新的实时项目,因此重写代码以实现更好的多实例性并不是一个简单的选择。举一个具体的例子,假设我们有库代码(忽略unsafeness!):Linux上具有单独数据段的库的多个实例
// 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());
怎么能这样做呢?
重写代码以正确完成工作。 –
@JonathanLeffler我的确尝试过,但有5,6层的全局变量,混合模块静态变量,指向其他文件的全局变量,以及混搭的内存,以及指针复制的长链,解决生命周期很痛苦,当然另一个团队正在更新代码,因此合并他们的更改变成了PITA。理想情况下,其他团队应该重构他们的东西,当然,但... –
有时软件可能非常僵硬。但是,我认为没有一种理想的方式来实现你想要实现的目标。如果你显示的代码代表你想要的代码,线程本地存储不会起作用。你必须编写使用'new_instance'来分配结构的代码(参数不相关) - 可能是一个指针,所以你可以编写'inst1-> foo_init(&data1)'等等。 d必须释放与句柄相关的数据,以避免内存泄漏。这是一条滑路。任何使用旧界面的东西都不能多线程使用。 –