C++ 如何封装C/C++;库代码是否可以在具有多个实例的单独线程中运行?

C++ 如何封装C/C++;库代码是否可以在具有多个实例的单独线程中运行?,c++,c,macros,namespaces,C++,C,Macros,Namespaces,想象一下,一个开发时间跨度超过10年的项目。有些部分是C,有些是C++,所有代码都使用全局函数和全局变量。该体系结构本质上是单线程设计的,并以这种方式不断增长。但是现在我们考虑使用许多核心体系结构。 现在评估的一个想法是将代码的一部分重构到库中,使创建多个实例成为可能,这样它们就可以在单独的线程中运行,并且不会相互干扰 在这一点上最具吸引力的建议是使用宏定义将所有库文件包装到名称空间中,如: namespace VARIANT { // all the code } 然后在标题或项目级

想象一下,一个开发时间跨度超过10年的项目。有些部分是C,有些是C++,所有代码都使用全局函数和全局变量。该体系结构本质上是单线程设计的,并以这种方式不断增长。但是现在我们考虑使用许多核心体系结构。 现在评估的一个想法是将代码的一部分重构到库中,使创建多个实例成为可能,这样它们就可以在单独的线程中运行,并且不会相互干扰

在这一点上最具吸引力的建议是使用宏定义将所有库文件包装到名称空间中,如:

namespace VARIANT {
    // all the code
}
然后在标题或项目级别定义
变量
。这将使得在不同的名称空间中有不同的上下文成为可能。其卖点在于,这种方法将需要最少的代码更改,并且引入任何回归的风险都很低

但是,如果在某个时刻我们需要使
Variant1
的行为与
Variant2
不同,事情就会变得棘手,因为无法将宏定义的值与预处理器宏中的字符串进行比较


有没有更优雅的方法来实现这一点?

另一种变体可能是发现所有全局变量,并使它们成为
thread\u local
。需要C++11或至少编译器扩展提供相同的功能(
\uuu-thread
使用较旧的GCC)


如果我读对了,你甚至不需要把C文件转换成C++文件(你的方法要求C不支持命名空间…),但是你需要C11来做.< /P> < P>重构一个旧的项目,使它多线程不是那么简单。首先,你有C和C++代码的混合,你不能盲目地遵循C++方法。您需要在以下区域中设置名称空间,而不是名称空间:-

  • 找出所有需要同步的代码块、容器(如
    列表
    大型数组
    )等
  • 找出线程之间的相互依赖关系以及如何控制它们。例如,一个线程将生成一个报告并插入到一个表中,第二个线程需要这些信息来生成最终报告,现在您需要找出代码库中线程之间的这种依赖关系,并需要找出它们的控制机制
  • <> L> >P> C++中的多线程风格非常棘手,因此需要将代码迁移到C++ 11,实现多线程更容易。

  • 正如您所说,在您当前的项目中有很多全局变量,您需要正确地考虑如何在不同的线程之间共享这些变量,以及如何同步这些变量的访问

  • 这是一些提示,你需要在重构之前提前考虑很多领域,否则你的所有努力都会烟消云散。


    祝你的计划好运。

    只需分步执行,每次测试:

    1) typedef包含所有全局变量的结构。mallocone,并编辑现有代码以引用它。测试-应与全局测试完全相同

    2) 创建一个线程来运行代码的一个实例。测试-应与全局测试完全相同

    3) 尝试多线程

    一步一个脚印


    请尽最大努力不要尝试任何错误

    优雅的方法是重构整个过程,而不是使用全局变量,但您已经知道这一点;)我不知道名字空间是否“优雅”,你必须把C文件转换成C++文件(C不支持命名空间!),你必须重新编译整个库,以使用它!这似乎是一个很好的选择。当然,一个全面的重构策略将比这更广泛,但是
    thread\u local
    提供了类似于
    namspace
    的每个线程的分离,只是以一种更干净的方式。