c++ - 使用来自另一个 C++ 类的全局变量创建 C++ 源文件的多个实例

标签 c++ c

我想知道是否可以使用来自另一个 C++ 类的全局变量创建多个 C++ 源文件实例,

假设我的 C++ 源文件看起来像

源代码.cpp

int global_var1;
int global_var2;

extern "c" int function1(){
 // do some thing with global_var1
}
extern "c" int function2(){
 // do some thing with global_var2
}

现在,如果我从具有多个实例的 C++ 类中调用它,它应该是正确的方法吗?

克服这种情况的更好方法是什么,我无法将 source.cpp 修改为另一个 calss。

编辑:我想知道的是,当我从不同的类调用 source.cpp 上的函数时,我应该为每个实例获取不同的全局变量,还是全局变量只共享内存?。

我们将不胜感激。

最佳答案

一个全局变量在内存中只存在一次,并且将被整个程序共享,即每个实例/函数将访问相同的内存,并且一个实例/函数所做的修改将对所有人可见。

我想您已经知道应该避免使用全局变量。但是如果你不能修改 source.cpp(并且必须按原样使用它),情况是:

在单线程的情况下,你不会有问题。

在多线程的情况下,您可以在调用两个函数时在类中使用 std::mutex 来保护对 function1 和 function2 的访问。通过这种方式,您可以确保当时只有您的类的一个实例访问全局变量。

类似于:

class A {

    static std::mutex myLock;

    void someFunc()
    {
        myLock.lock();
        int x = function1();
        myLock.unlock();
    }
}

std::mutex A::myLock;

如果你不想要真正的全局变量,而是想模拟你的类的每个实例都有它“自己的”全局变量,你可以尝试这样的事情:

class A {

    int mglobal_var1;
    int mglobal_var2;

    static std::mutex myLock;

    void someFunc()
    {
        myLock.lock();
        global_var1 = mglobal_var1;  // Set the real global to "local" value
        int x = function1();
        mglobal_var1 = global_var1;  // Save the real global for later use
        myLock.unlock();
    }
}

std::mutex A::myLock;

关于c++ - 使用来自另一个 C++ 类的全局变量创建 C++ 源文件的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409126/

相关文章:

c++ - 如何导出模板函数?或者这种情况的首选方法是什么?

c++ - 如何在 Eclipse CDT 中启用 C++11/C++0x 支持?

c - 单元测试 C 库,内存管理

c - 无法通过 unix 系统调用使用 c 写入文件

c++ - OpenCL 内核因特定参数而崩溃

c++ - qmake:检测目标位宽(32 位或 64 位)

C - System V - 删除共享内存段

c - C 中用位表示一组整数

c++ - 关于使用 operator reinterpret_cast 将引用类型转换为另一个的奇怪问题

c - 每次第一个数字都会重复,我不明白为什么会发生这种情况