gpt4 book ai didi

c - C程序中重新初始化库变量

转载 作者:太空狗 更新时间:2023-10-29 12:06:08 24 4
gpt4 key购买 nike

我正在尝试编写一个程序,我必须通过(共享)库(其源代码可用)调用一些函数。库的 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 开发项目时,我习惯于将一些代码封装在 webservices 中,然后从主程序中调用这些服务。 C/Linux 中是否存在类似的框架?请注意函数正在返回数据。

最佳答案

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

既然您可以访问源代码,我建议您花一些时间来重构源代码。

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

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

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

关于c - C程序中重新初始化库变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567324/

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