精华内容
下载资源
问答
  • 写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局变量的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的...

    转载自:https://www.cnblogs.com/super119/archive/2011/04/10/2011305.html

    之前在linux下做过一个测试:

    写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局变量的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么?

    答案是不会。这是测试的答案。

    现在知道原理了,尽管这是windows via C/C++中解释的windows的做法,但是我想linux也是这么类似处理的。

    windows 使用memory map来加载exe和dll。当一个exe/dll有多个instance要启动时,实际在windows paging file(包括RAM和swap文件)中,exe和牵涉到的dll,只有一份。这样可以节省内存使用,也可以提高性能。

    也就是说,如果是exe,虽然每个instance都有自己独立的地址空间,但是地址空间映射到storage的时候,他们映射的都是同样的地方。这样就带来问题了:exe/dll中的全局变量和静态变量怎么办?每个instance都有可能会修改这些变量。

    windows 的做法是,该存放全局变量和静态变量的page,设定copy on write protect attribute。所以,当任何一个线程尝试修改这些page中的内容时,windows负责分配一个新的page出来,然后修改该线程的地址空间,将 这个新分配的page的地址设置上去,从此以后,该线程修改这个全局变量或是静态变量,操作的就是这个新分配的page了。这样,多个实例就不会出现全局 变量或静态变量互相覆盖的问题了。

    展开全文
  • 本文主要验证动态库全局变量和动态变量影响环境,经测试验证。动态库,代码共享,数据分离,不管是什么数据。 Compute.h:代码如下: #ifndef __COMPUTE_H #define __COMPUTE_H int GetResult(); int ...

    本文主要验证动态库的全局变量和动态变量影响环境,经测试验证。动态库,代码共享,数据分离,不管是什么数据。

    Compute.h:代码如下:

    #ifndef __COMPUTE_H
    #define __COMPUTE_H

    int GetResult();
    int GetStaticResult();

    #endif

     

    Compute.cpp:代码如下:

    #include "Compute.h"

    static int gn_test = 1;
    int GetResult(){
        ++gn_test;

        return gn_test;
    }

    int GetStaticResult(){
        static int s_nTest = 1;
        ++s_nTest;

        return s_nTest;
    }

     

    main.cpp代码如下:

    #include "Compute.h"

    #include <iostream>
    #include <thread>
    #include <chrono>

    void ShowValue(){
        while(true){
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::cout << "Value:" << GetResult() << std::endl;
            std::cout << "Static value:" << GetStaticResult() << std::endl;
        }
    }

    int main(int argc, char**argv){
        std::thread tTask(ShowValue);

        tTask.join();

        return 0;
    }

    编译选项如下:

         1、先生成动态库:

    g++ -fPIC -shared -o libCompute.so Compute.cpp

        2、生成执行文件,并链接动态库

                g++ main.cpp -lpthread -L . -lCompute -o test

        3、拷贝文件到搜索目录

         $ sudo cp libCompute.so /usr/lib/

        4、在2个终端运行,结果互不影响:

       

    展开全文
  • 动态库在被系统加载后,代码段只有一份,所有使用者共享。对于代码段要分两种情况: 如果是多进程的话,数据段在每个进程中拥有一个独立的副本,所以数据是安全的。 如果是多线程的话,数据段在同一个进程中是...

    A、 一般情况

    动态库在被系统加载后,代码段只有一份,所有使用者共享。对于数据段要分两种情况:

    • 如果是多进程的话,数据段在每个进程中拥有一个独立的副本,所以数据是安全的。
    • 如果是多线程的话,数据段在同一个进程中是同一个地址空间,所以数据是不安全的。

    B、共享数据段

    共享数据段可以解决多个进程希望通过一个动态库里的某个全局变量来实现进程间通信的问题。

    C、线程私有存储(Thread Local Storage)

    多个线程访问不同的全局变量副本,比如C语言运行库的errno全局变量。

    线程私有线程之间共享(进程所有)
    *局部变量*全局变量
    *函数的参数*堆上的数据
    *TLS数据*函数里的静态变量
    *程序代码,任何线程都有权利读取并执行代码
    *打开的文件,A线程打开的文件可以由B线程读写
    1. 静态TLS
      __declspec(thread)
    2. 动态TLS
      int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
      void *pthread_getspecific(pthread_key_t key);
      int pthread_setspecific(pthread_key_t key, const void *value);
      int pthread_key_delete(pthread_key_t key);
      
    展开全文
  • 请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢? 你这个问题得分被调用的是同一个进程还是不同的进程。如果是...

    动态链接库的全局变量问题

    请问动态链接库被外部多次调用时,每次调用中动态库自身的全局变量都会重新初始化吗?如果会那怎么来使我每次调用动态库时都能从上次的状态开始执行呢?

    你这个问题得分被调用的是同一个进程还是不同的进程。如果是不同的进程,那么你的动态连接库就完全是重新加载的。因为动态连接库是被映射到调用的那个进程的空间里的,而不同的进程有不同的地址空间,所以不同进程调用同一个DLL基本就没什么关系,除非你声明了一些变量在共享数据段,这样这些变量就会在不同的进程间共享。

    如果你同一个进程多次LoadLibrary,就不一定会重新初始化,事实上Windows是这样运作的。他为动态连接库创建一个变量用来记录被Load的次数,在一个进程中每次LoadLibrary这个引用计数就会加1,每次FreeLibrary这个引用记录就会减1,当计数变为0时,Windows则完全释放这个DLL,这时候你再一次加载,那么所有初始化的工作就会重新来一遍。如果你加载已经在程序其他地方加载过的DLL,那么就不会初始化。

    保存状态可以保存到文件,保存到注册表等。

    展开全文
  • 在A中定义全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
  • Linux C中动态链接全局变量问题

    千次阅读 2020-05-05 11:43:51
    如果一个共享对象libtest.so中定义了一个全局变量G,而进程A和进程B都使用了libtest.so, 那么当进程A改变这个全局变量G的值时,进程B中的G会受到影响吗? 古人云:实践出真知... /* * =========================...
  • 动态库全局变量与当前应用全局就量重名编译不会出错,当前应用全局变量覆盖动态库全局变量. 三.静态库全局变量动态库全局变量重名编译不会出错,先链接谁,谁优先.如果多个静态库全局变量重名,编译出错. 四,...
  • 问题描述 回归正题,前段时间项目开发中,实现了一个动态库,封装了一些方法。...应用程序进行链接的时候,动态库全局变量定义,将会被应用程序中同名的全局变量所覆盖。这样也就造成了,在动态库中修改A..
  • 动态库中的全局变量与静态变量

    千次阅读 2020-03-10 10:28:04
    写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局变量的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的...
  • 做法:在console中调用libvlan.so中的两个APIs,分别是设置和获取动态库中一个全局变量的值。 结果:在console中的操作没有问题,设置和获取都正常;但在动态库中打印该全局变量,其值并没有改变。 结论:动态库...
  • 全局变量的导出(这里是在windows环境下去讨论这个问题) 全局变量的导出与函数的导出并不一样,我们导出全局变量我们必须提供.def的文件去解析   我们这里创建的DLL是Test_Dll Test_Dll.cpp的文件实现 #...
  • 之前在linux下做过一个测试: 写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局...此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么...
  • 多进程访问动态库全局变量问题

    千次阅读 2014-05-30 11:29:15
    1、如果你做的动态库里面有全局变量,而且你想让不同的jinc
  • 动态链接全局变量与多线程

    千次阅读 2018-09-30 16:48:16
    最近对多线程调用时,动态链接全局变量有了以下几点认识。 1、动态链接被同一进程的多个线程加载时,全局变量的值是进程有效。  例如:动态链接C.dll有一个全局变量 int g_iCount=0(初始值)。某一函数...
  • C++又一坑:动态链接中的全局变量

    千次阅读 2017-03-20 22:12:27
     前几天我们项目的日志系统出现了一点问题,但是一直没有时间去深究。 昨天在同事的帮助下,无意中猜了一种可能性,结果还真被我...关键在于静态a里有一个静态全局变量,没错就是我们的日志模块。 原先的这个
  • 但因为没有一开始就分离,结果:想分离的函数用了不少全局变量;编译so没问题,主程序加载so就出问题了,报变量符号找不到。各种搜索无果,最后发现:“在linux上,链接主程序的时候,使用参数-Wl,--export-dynamic...
  • 此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么? 答案是不会。这是测试的答案。 现在知道原理了,尽管这是windows via C/C++中解
  • 应用程序中含有全局变量A,动态库中也含有全局变量A,当我调用动态库中函数后,发现应用程序的A发生了变化!!!O,My God!对于我这种还没在Linux下做过开发的人来说,一头雾水。。。。。。 于是我尝试着,将A中的...
  • 动态库与主程序共享全局变量

    千次阅读 2017-03-20 22:15:18
     曾经在一次写程序的时候,全局使用一个日志对象,所有的日志信息都由此日志对象写入文件。但是发现在动态链接库里,无法存取到该全局对象,后...例如动态库里定义全局变量int i, 在主程序里申明extern int i。 则
  • 但却出现了GDB打印全局变量optind的时候出现错误。 问题发现和描述  首先optind是使用getopt时候的全局变量,表示使用getopt时候的下一个argv的指针索引。在应用程序调试的时候设置了多个参数,但是随着多次调用...
  • 多进程引用的动态链接中的全局变量问题现有liba.so中定义一个全局变量char buf; libb.so 中的函数print会将buf进行输出。 进程A和进程B使用-lb进行编译链接,并在进程A和B中分别对buf进行初始化,如strcpy...
  • MFC中如何定义全局变量

    万次阅读 2014-07-19 10:37:02
    MFC中如何定义全局变量 3种方法: 1、在一个cpp文件中用extern声明,然后在其他文件中定义就可以用  2、全局类的对象来实现  3、在**APP类中做公有变量,其他类中用AfxGetApp()得到一个App对象指针就可引用 ...
  • 主程序与动态库之间的全局变量

    千次阅读 2013-07-01 16:51:32
    个人有种更简单的办法, 直接在动态库里malloc全局变量内存, 然后, 在动态库定义一个方法或者是函数返回改全局变量的地址, 主程序需要访问这个动态库全局变量的, 直接调用这个函数返回全局变量地址进行与...
  • 进程间是相互独立的,其实完全可以看成A、B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一份的。 然后在这个基础上,由于代码段是不会被修改的,所以操作系统可以...
  • 动态库定义全局变量,可以在调用该动态库的程序中进行访问和修改。
  • 用vs编译动态库如果配置错误会导致全局变量不能初始化。 例子: string a="hello"; char b="hello"; int main(int arg,char* argv[]) { printf("string a=%s",a.c_str()); printf("char* b=%s",b); } ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,494
精华内容 51,397
关键字:

动态库定义全局变量