精华内容
下载资源
问答
  • C语言多线程,动态库和静态库

    千次阅读 2016-06-11 10:52:38
    C语言多线程,动态库和静态库

    1 初识多线程

    通常一个进程(process)下都是并发运行着多个任务,例如360卫士可以扫描病毒的同时清理系统垃圾文件或者安装软件。而如果在不使用线程的情况下,程序都是按照某个顺序(从上到下,选择或者是循环)单线程运行,这样的效率通常都比较低,服务器得应用以及处理大型数据的程序都是多线程并发同时处理多个任务,这样能够充分利用系统资源,更加高效的完成任务。

    单线程VS多线程

    单线程同步打开五个对话框:

    #include <Windows.h>
    #include <process.h>
    #include <stdlib.h>
    
    //进程:加载到内存中的程序,至少有一个线程在运行,通常是多线程并发运行
    //单线程 程序代码按照同步依次从上到下执行
    //多线程 程序代码按照异步乱序执行
    
    
    /*
        单线程显示5个对话框
        @author Tony 18601767221@163.com
        @since 2016060610 15:33
    */
    void show_dialog() {
    
        //如果没有启动多线程则是同步打开五个窗口,一个接着一个按照顺序打开
        for (int i = 0; i < 5; i++) {
            MessageBoxA(0, "单线程执行", "显示对话框", 0);
        }
    
    }
    
    /*
        主线程入口
        @author Tony 18601767221@163.com
        @since 20160609  07:43
    */
    void main() {
        show_dialog();
        system("pause");
    }

    多线程同时打开五个对话框:

    /*
        定义线程任务
        @author Tony 18601767221@163.com
        @since 20160609  07:45
    */
    void run(void *p) {
    
        //如果没有启动多线程则是同步打开五个窗口,run方法为普通的方法,而不是作为线程的入口
    
    
            MessageBoxA(0, "多线程执行", "显示对话框", 0);
    
    }
    
    /*
        主线程入口
        @author Tony 18601767221@163.com
        @since 20160609  07:43
    */
    void main() {
        for (int i = 0; i < 5;i++) {
            //启动线程  
            _beginthread(run, 0, NULL);//把run函数当做线程的入口点
        }
    
        system("pause");
    }

    2初识动态库

    动态库可以作为一个组件,通过工具植入到应用程序当中。
    在使用VS2015开发应用程序时,默认生成的都是和项目名称保持一致的可执行程序(例如HelloWorld.exe),而除了.exe之外还可以选择以动态链接库(.dll)的方式生成和以静态链接库(.lib)的方式生成。
    程序生成格式

    如何编写一个dll?看如下程序

    
    #include <Windows.h>
    //预编译时去掉DOS窗口
    #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
    
    
    /*
        dll模块注入
            需要先将项目属性的配置类型改成动态链接库(.dll),dll运行时不需要main函数
            只需要通过工具将其注入到其他进程中即可
        @author Tony 18601767221@163.com
        @since 20160609 08:04
    */
    //导出接口
    _declspec(dllexport) void module() {
    
        MessageBoxA(0, "李彦宏请你到百度去喝茶", "百度系统消息", 0);
    
    
        for (int i = 0; i < 200;i++) {
    
            malloc(1024*1024*20); //每次循环吃20M内存
        }
    }

    编写完成之后需要将项目默认值的配置类型改为dll,更改输出的dll目标文件名,然后重新生成包含dll模块的源程序,再通过dllinject工具配置dll文件路径和函数名称就可以注射到其他进程中。

    3初识静态库

    通常情况函数的声明都在头文件中,而函数的实现是在源文件中。如果要想调用一个第三方的库函数,咋办呢?

    这里首先实现一个简单的第三方库函数:
    在WindowsC的解决方案下新建一个名为WindowsCLibrary的项目
    我的项目结构如下:
    项目结构
    函数的声明(windowslib.h)如下:

    
    int add(int one, int two); //头文件声明函数

    函数的实现(windowslib.c)如下:

    
    int add(int one,int two) {
    
        return one + two; //返回两个整数的和即可
    }

    编写完头文件和源文件之后将项目设置配置类型为静态库(我这里设置的文件就是WindowsCLibrary.lib)
    静态库
    然后将编译生成后的头文件(windowsclib.h)以及库文件(WindowsCLibrary.lib)都复制到将要调用第三方库函数的项目的根目录下:(C:\Tony\WindowsC\WindowsC\WindowsC)
    复制头文件和库文件

    接下来就可以在WindowsC项目中引用WindowsCLibrary项目的函数了

    #include <stdio.h>
    #include <stdlib.h>
    #include "windowslib.h"
    
    #pragma comment(lib,"WindowsCLibrary.lib") //加载指定的模块
    
    void main() {
    
        int result = add(3, 5);
    
        printf(" result =%d ",result );
    
        for (int i = 0; i < result;i++) {
    
            //system("notepad");
        }
        system("pause");
    
    }

    欢迎扫描下方的二维码,关注微信公众服务号-艺无止境,分享IT技术干货。
    艺无止境

    展开全文
  • 好用的c++多线程软件 Pthread visual studio可用,mfc可用
  • 封装动态库

    封装动态库

    展开全文
  • 动态链接的全局变量与多线程

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

    最近对多线程调用时,动态链接库的全局变量有了以下几点认识。

    1、动态链接库被同一进程的多个线程加载时,全局变量的值是进程有效。

       例如:动态链接库C.dll有一个全局变量 int g_iCount=0(初始值)。某一函数Method_D被调用一次,则g_iCount++。

                  当某一进程加载C.dll后,线程A、B先后调用Method_D后,线程A获得的C.g_iCount=1,但线程B获得的C.g_iCount则是2。

        这是因为线程B调用Method_D前,g_iCount已经被线程A更改。

     

    2、虽然说动态链接库的全局变量是进程级的,但并不是说 同一进程里,不同模块定义同名全局变量就可以互相传递数值。

         这跟我们的函数一样,即使在同一进程空间里,定义成相同名字跟结构,只要没有做导出,外部模块还是不能调用的。

         所以,如果想在同一进程的不同线程间共享某一数据,也可以在全局变量定义时,使用_declspec(dllexport) 将其导出,

          在调用处使用GetProcAddress()取得其在进程空间的地址来使用。

    展开全文
  • 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的...需要弄清楚,在配置环境正确的情况下,boost生成的是动态库还是静态库,然后在调试的过程中注意,vs的生成代码的调试环境是MT、MD、MTd还是MDd(分别对应r...

    无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法

    需要弄清楚,在配置环境正确的情况下,boost生成的是动态库还是静态库,然后在调试的过程中注意,vs的生成代码的调试环境是MT、MD、MTd还是MDd(分别对应release和debug模式下的静态连接和动态连接的多线程调试环境)。在调试中缺少哪个链接库直接加就好了,一般问题就解决了。

    具体可以参考下面下面相关的博客内容和步骤

    1.到官网下载最新的boost,www.boost.org 这里我下载的1-58版本

    2.解压

    3.从开始菜单打开VS的Visual Studio Tools,选择X86命令提示(感觉应该也可以用Dos)

    4.到解压目录下,例如我解压到D盘,则进入D盘,进入boost_1_58_0目录,然后运行bootstrap.bat文件。稍等一小会就OK。

    5.此时该文件夹下将会生成bjam.exe文件。使用这个工具来编译boost库。按照网上的说法VS2013要指定输出库的类型,否则会缺少一个lib文件。

    这里动态库和静态库分别的编译命令如下: 

    // 如果要获取动态库:

    bjam install stage --toolset=msvc-12.0 --stagedir="C:\Boost\boost_vc_120" 

    link=shared runtime-link=shared threading=multi debug release   

    // 如果是要获取静态库: 

    bjam install stage --toolset=msvc-12.0 --stagedir="C:\Boost\boost_vc_120" 

    link=static runtime-link=static threading=multi debug release  

    这里我选择静态库,当然可以根据自身的要求选择更多。就在刚刚的命令行下继续执行这个编译命令。大约需要30分钟。根据电脑配置,太低可能要一小时。然后等待编译完毕。

    6.此时编译完成后,将上面在C盘的Boost库拷贝到任意的位置等待使用。例如我拷到了D盘。

    7.在VS中包含include和lib。C++常规中和连接器中将目录添加进去。

    8.可以使用boost啦。

    #include "stdafx.h"
    #include <iostream>  
    #include <boost/thread/thread.hpp>  
    void hello()
    {
       std::cout << "Hello world, I'm a thread!" << std::endl;
    }
    int main()
    {
       boost::thread thrd(&hello);
       thrd.join();
    }

    无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib

    出错!

     

    想一想,刚刚说的,多线程?

    解决办法:


    将MDd改成MTd。再去运行一下。就OK了。

    备注:

    1>生成的文件名

    libboost_log-vc120-mt-sgd-1_58.lib,其中mt表示多线程,sgd中的s表示runtime 是static,gd表示debug版本。 

    2>将生成的lib和头文件加到vc目录下面

    将需要lib,比如boost_1_58_0\lib\vc12_x64\lib加到lib目录下面

     

    展开全文
  • 【c++】求大神回复,我的动态库被别人使用多线程调用,我单线程调用了一个别人写的动态库,我调的这个库需不需要支持可重入,要不要加锁保护?我调的库,我把它当一个函数使用,它里面也挺复杂的,好多全局变量。
  • case DLL_PROCESS_ATTACH: //进程被调用 case DLL_THREAD_ATTACH: //线程被调用 case DLL_THREAD_DETACH: //进程被停止 ... } } 2动态链接和静态链接 1静态链接 静态链接的英文全称是Static Link Library它经
  • https://www.xuebuyuan.com/1551347.html
  • 本文讨论了基于VC开发环境的异步串行通信动态链接的开发、设计过程,基于本文的动态链接,在开发的监控安防项目中上位机访问组网的控制器时,工作良好。
  • C/C++:多线程下使用dlopen、dlsym、dlclose装载动态库
  • Delphi 多线程安全动态库 dll

    千次阅读 2007-09-12 13:46:00
    在 delphi 做动态库时,会自动提示要 uses ShareMem,这个实际用起来是不方便的,因为 dll 可能要发布,要给其他人用,而别人用什么语言来开发是说不准的,如果不是delphi,就没办法用了。因此在接口上一般是用 ...
  • 学习4-4期视频笔记1、 创建线程,并行执行#include #include //线程相关 voidrun(void *p) //void *p,代表一个空地址 { MessageBoxA(0, "你好", "123",0); } voidmain() { for (int i = 0; i ; i++) {
  • 把目标进程编译成多线程版本 在编译目标进程时,加上 -lpthread 选项——哪怕它里面完全没有任何涉及多线程的地方;so编译时,不必加 -lpthread 选项; 结果: 注入并且hook就都是成功的了; 后续 原本怀疑是不是...
  • 那样就算不使用全局和静态变量,动态库多线程调用,也很危险啊。比如一个函数 int sum(int x, int y) { ......做一些其他的事情 return x +y ; } 这样第一个进程调用的时候 sum(10, 20),当...
  • 最近把做的东西封装了一下,写成一个动态库,在Qt的应用中测试很好,跑起来没问题。但是用其他语言调用时出了一个意外,总是输出QEventLoop: Cannot be used without QApplication。究其原因是用了QEventLoop,但是...
  • 因为程序需要,自己封装了一些 动态库,供自己程序使用, 动态库源码中 包含了一些全局变量,这些全局变量 最终会有保存的数据供 接口返回? 单线程 肯定没有问题,但是 多线程 在调用的时候 会不会出现一些问题呢?...
  • 二、pthread-win32动态库静态库编译方法及注意事项 (1)、解压下载后的压缩件,解压后,有“Pre-built.2”、“pthreads.2”两个文件夹,源码就在pthreads.2文件夹下。 (2)、用vs2010打开pthreads.2下面的...
  • 2、COM组件是以WIN32动态链接(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 3、COM组件是遵循COM规范编写的 4、COM组件必须是动态链接的 5、COM组件不是一种计算机语言 6、COM组件不是DLL,只是利用DLL来给...
  • 调用第三方 多线程开发防止

    千次阅读 2013-12-03 15:24:44
    开发信用卡转账的问题集 ...在qt中应用动态库,需要在.pro文件中加入LIBS += -Lc:/gmc/qmf -lposinfqmf 说明:-LC:表示动态库.lib文件的路径,-l表示的是动态库.lib的名字。 2.头函数的编写  如果
  • #include <windows.h> //使用动态库加载需要使用windows.h头文件 #include #include typedef int (* padd )( int a , int n ); //定义函数指针 int main () { HMODULE mydll = LoadLibraryA ( "my....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,138
精华内容 455
关键字:

动态库多线程