2

我正在尝试编写一个程序,我必须通过(共享)库调用一些函数(其源代码可用)。库的 C 代码有几个全局变量,许多函数会更改这些全局变量的值。我在我的程序中必须做的事情要求我所做的每个函数调用都可以使用一组新的变量。

例如,让这个函数成为库的一部分:

int x = 1;

int foo()  
{  
    int a = 0;
    //do somethings to 'a'
    //...
    x++;
    return a;
}  

现在,每次我foo()从我的程序中调用时,值x都会从 1 更新到 2,然后是 3,然后是 4,依此类推……我尝试构建一个程序,以便每次foo()调用时,它都会看到 x = 1。

很抱歉,我对 C/linux 如何处理这些变量空间的知识还不够,所以这个问题可能看起来很模糊。以上只是一个小例子;实际上,有很多变量几乎不可能手动重置它们的值。

编译该库和/或在我的程序中使用它以刷新变量的最佳方法可能是什么?

(附带说明一下,我还想做的是并行化对 foo() 的调用,但由于共享变量,我不能这样做。)

编辑:在处理一些 Web 开发项目时,我曾经将一些代码封装在 Web 服务中,然后从主程序中调用这些服务。C/Linux 中是否存在类似的框架?请注意,函数正在返回数据。

4

2 回答 2

3

您已经发现全局变量(或一般的全局状态)是一个非常糟糕的主意的主要原因之一。

由于您可以访问源代码,因此我建议您花一些时间来重构源代码。

您可以使用以下策略实现并行调用foo的能力:

  • 将所有全局变量收集到一个struct中。称它为Context之类的东西。
  • 更改作用于全局变量的每个函数以获取指向Context的指针,并更改函数以更新Context中的变量而不是更新全局变量。
  • 现在每个想要使用该库的线程都可以创建一个新的Context并将其传递给foo和相关函数。

如果对源代码进行这样的更改不可行,您可以通过启动子进程来使用多个 CPU 内核。每个子进程都有自己的内存空间。该选项不如使用多线程有效。

于 2012-07-19T18:50:22.787 回答
0

我没有详细的答案。但您可以尝试以下方法之一:

  1. 卸载和加载库
  2. 尝试清除库的 .bss 并用库中的值填充 .data 部分(参考 dl_iterate_phdr() 调用)。
于 2012-07-19T19:16:41.550 回答