C/C++ 多线程编程/ 绑定CPU

       Pthread是由POSIX提出的一套通用的线程库,在linux平台下,它被广泛的支持,而windows平台下,却并不被支持,而pthreads-w32为我们提供了解决方案

     多线程编程需要包含头文件   #include <pthread.h>

     #include <unistd.h> 中的函数 long sysconf (_SC_NPROCESSORS_ONLN); 可以获取当前CPU的核数。

     多线程程序也可以在单核CPU上运行,但同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑。

     多线程编程时,可以指定CPU完成某一个任务,也就是线程绑定;也可以不指定,不指定时,由系统自由分配CPU。

 1. 创建线程pthread_create

函数原型:

int  pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn)(void), void *restrict arg);

返回值: 成功则返回0, 否则返回错误编号.

参数:

tidp: 指向新创建线程ID的变量, 作为函数的输出,此ID唯一指定线程,其他线程相关函数都需要此ID作为入参(线程同步函数不需要)。

attr: 用于定制各种不同的线程属性, NULL为默认属性.

start_rtn: 函数指针, 为线程开始执行的函数名.该函数可以返回一个void *类型的返回值,而这个返回值也可以是其他类型,并由 pthread_join()获取

arg: 函数的唯一无类型(void)指针参数, 如要传多个参数, 可以用结构封装.

pthread_create 一般在main中调用,调用1次创建一个线程。多个线程做同一件事情,则第三个参数  函数指针可以相同;如果不同线程间做不同的事情,则函数指针不同,对应不同的task thread 函数。

线程创建之后,可以紧接着对各个线程指定CPU,也就是绑定;如果不绑定,则由系统自由分配。

2. 线程同步pthread_barrier_init/wait/destory

线程间的同步,需要用到以下三个函数,函数原型:

int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned count);
int pthread_barrier_wait(pthread_barrier_t *barrier);
int pthread_barrier_destroy(pthread_barrier_t *barrier);

其中,pthread_barrier_t是一个计数锁,对该锁的操作都包含在三个函数内部,我们不用关心也无法直接操作。只需要实例化一个对象丢给它就好。需要注意的是,参数是指针;一般直接实例化pthread_barrier_t  g_barrier,然后将 & g_barrier作为实参传递给函数。

pthread_barrierattr_t,锁的属性设置,设为NULL让函数使用默认属性即可。

count,你要指定的等待个数。比如需要4个线程间同步,则count设置为4。

pthread_barrier_init 和pthread_barrier_destroy,顾名思义,就是初始化和销毁,一般都在main中调用,且都只需要被调用一次。

pthread_barrier_wait是阻塞型等待,主要用于线程间同步。当代码执行到 pthread_barrier_wait的时候,先去check 是否所有的线程都在wait了,如果都在wait了,那么大家一起解锁。

pthread_barrier_wait则是在创建的线程函数(此处称之为 task thread函数)中被调用,在一个task thread函数中,可以多次调用pthread_barrier_wait,但需要保证在所有的task thread函数中调用相同次数。

3. 等待线程结束pthread_join

int pthread_join(pthread_t thread, void **retval);

描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值,一般设为NULL。

返回值 : 0代表成功。 失败,返回的则是错误号

参考 https://blog.csdn.net/qq_37858386/article/details/78185064

4. 线程绑定CPU

参考 https://www.cnblogs.com/wenqiang/p/6049978.html

cpu亲和性(affinity)用于绑定到固定的CPU上。主要有以下函数。

int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);//进程绑定函数
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);//线程绑定函数
void CPU_ZERO (cpu_set_t *set)  /*这个宏对 CPU 集 set 进行初始化,将其设置为空集。*/
void CPU_SET (int cpu, cpu_set_t *set) /*这个宏将 指定的 cpu 加入 CPU 集 set 中*/
void CPU_CLR (int cpu, cpu_set_t *set) /*这个宏将 指定的 cpu 从 CPU 集 set 中删除。*/
int CPU_ISSET (int cpu, const cpu_set_t *set)
/*如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。*/
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,  cpu_set_t *cpuset);

线程绑定CPU的具体操作可以参考:https://blog.csdn.net/qq_26697045/article/details/89457241

以下是一个参考网络,并自己修改过的例子

/******
编译时需要加pthread选项  g++ -g -Wall -pthread main.cpp -o sim
https://blog.csdn.net/qq_37858386/article/details/78185064
原实例在64bit机器上执行会报以下错误
   error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive]
      int id = (int) param;
   因为在64bit机器上指针占8个字节,int占四个字节,从void* 到 int 的转换丢失精度
   改为int id = (long) param; 可编译通过
原实例 void* task(void* param) 没有返回值,可以添加return NULL;
如果想传递多个参数,可以用一个结构体进行封装
******/

#include <pthread.h>
#include <stdio.h>
#include <sys/sysinfo.h>
#include <unistd.h>
struct my_para {
    int id;
    long aux;
};
pthread_barrier_t b;
void* task(void* param) {
    // int id = (long) param;
    my_para * t_para = (my_para * ) param;
    int id = t_para->id;
    delete t_para;
    
    for (int i = 0 ; i < 2 ; ++i){
        pthread_barrier_wait(&b);
        printf("loop = %d , before the barrier %d\n", i, id);
        pthread_barrier_wait(&b);
        printf("loop = %d , after the barrier %d\n", i, id);
    }
    return NULL;
}
int main() {
    int nThread = sysconf(_SC_NPROCESSORS_ONLN);//return long, but dont care
    printf(" cpu num : %d \n", nThread);
    int i;
    pthread_t thread[nThread];
    cpu_set_t t_mask;
    pthread_barrier_init(&b, 0, nThread); //initial barrier
    for (i = 0; i < nThread; i++)
    {
        my_para * t_para  = new my_para;
        t_para->id  = i;
        t_para->aux = i  ;
        // thread[i] is returned by pthread_create 
        pthread_create(&thread[i], NULL , task, t_para);
        printf(" i = %d, thread pid = %d \n", i,  thread[i]);
        // pthread_create(&thread[i], 0, task, (void*)i);

        //bend thread function to CPU
        CPU_ZERO(&t_mask);
        CPU_SET(i,&t_mask);
        pthread_setaffinity_np(thread[i],sizeof(cpu_set_t),&t_mask);
    }
    for (i = 0; i < nThread; i++) {
        pthread_join(thread[i], NULL); //wait thread function finish
        printf(" thread finish \n" );
    }
    pthread_barrier_destroy(&b);  //destory barrier
    return 0;
}

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。
书名: ASP 3高级编程 英文原书名: Professional Active Server Pages 3.0 作者: Richard Anderson Chris Blexrud 译者: 刘福太 张立民 金慧琴 梁发麦 书号: 7-111-07678-8 页码: 925 定价: ¥89.00 会员价: ¥80.10 币值: 801 出版社: 机械工业出版社 出版日期: 2000-10-30 包含在Windows 2000中的Active Server Pages 3.0 (ASP 3.0)是Microsoft公司推出的又一个支持Internet的功能强大的网页制作软件包,除了继续保持其适应于各种浏览器的基本特征外,与ASP 2.0相比,功能更加强大,目前已成为开发Internet应用程序的理想选择。本书第1~7章介绍了ASP的基础知识、ASP 3.0的变化、ASP的对象模型、使用ASP脚本和外部组件的所要求的基本概念。第8~12章介绍了通用数据的访问和连接问题,包括ADO、UDA和XML。第13~18章介绍了使用ASP建立组件的问题,以及COM和COM+如何改变组件的环境。第19~23章是关于ASP与BackOffice类应用软件的结合问题,如Microsoft Message Queue Server、Collaborative Data Objects、Microsoft Exchange和Active Directory等等。第24~27章是在企业环境中使用ASP的安全性、性能和可扩展性等问题。第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于Internet网络应用与开发的广大科技人员和大专院校相关专业师生的一本重要的自学、教学参考书。 译者序 前言 第1章 ASP基础 1 1.1 ASP的起源 1 1.1.1 HTML的起源 2 1.1.2 动态页面的起源 2 1.2 ASP如何与IIS连接 5 1.2.1 关于应用程序的映射 5 1.2.2 处理一个ASP文件 7 1.3 相关设置问题和管理 12 1.3.1 IIS的安装 12 1.3.2 IIS管理工具 15 1.3.3 常见的管理任务 18 1.4 ASP 3.0对象模型概要 22 1.4.1 对象环境概念 22 1.4.2 ASP内置的对象 23 1.5 ASP 3.0中的新特性 24 1.5.1 ASP 3.0新特性概要 24 1.5.2 对ASP 2.0的改进 26 1.5.3 VBScript 5.0中的新特性 28 1.5.4 JScript 5.0中的新特性 30 1.5.5 其他的新特性 31 1.6 小结 32 第2章 请求和响应的处理 33 2.1 客户端和服务器的交流 33 2.2 Request和Response对象 35 2.2.1 Request对象成员的概述 35 2.2.2 Response对象成员概述 36 2.3 使用Form和QueryString集合 38 2.3.1 访问ASP集合的一般技术 38 2.3.2 访问和更新Cookies集合 44 2.3.3 Form和QueryString的差异 46 2.3.4 查看Request和Response对象内容 47 2.3.5 ASP中cookie的使用 52 2.4 使用ServerVariables集合 53 2.4.1 “自引用”页面 54 2.4.2 检测浏览器的版本 55 2.4.3 检测浏览器的语言 56 2.4.4 其他有用的ServerVariables集合的值 57 2.5 其他Request和Response技巧 57 2.5.1 连接、缓冲和页面重定向的管理 58 2.5.2 操作HTTP报头 60 2.5.3 使用客户证书 65 2.5.4 读写二进制数据 67 2.5.5 创建定制的日志消息 67 2.6 小结 69 第3章 ASP应用程序与会话 70 3.1 Web上的状态管理 70 3.1.1 状态的准确定义 70 3.1.2 状态的重要性 71 3.1.3 在Web上创建状态 71 3.2 Web应用程序的定义 73 3.2.1 ASP应用程序的定义 73 3.2.2 ASP会话的定义 81 3.3 ASP的Application对象和Session对象 83 3.3.1 ASP的Application对象成员概述 84 3.3.2 ASP的Session对象成员概述 85 3.3.3 使用Application和Session的事件 86 3.3.4 活动中的ASP Application对象 89 3.3.5 活动中的ASP Session对象 93 3.4 小结 96 第4章 服务器进程和ASP Server对象 98 4.1 动态页中服务器端的处理 98 4.2 服务器端的包含指令 100 4.2.1 不可思议的ASP #include指令 100 4.2.2 服务器端包含指令概要 102 4.2.3 服务器端包含指令的例子 104 4.3 ASP Server对象 109 4.3.1 ASP Server对象成员概述 109 4.3.2 创建其他对象的实例 110 4.3.3 执行其他的网页 114 4.3.4 Server对象的错误处理 118 4.3.5 获取Server对象的路径信息 125 4.3.6 使用Server对象格式化数据 127 4.4 小结 132 第5章 脚本运行期库对象 134 5.1 脚本对象的定义 134 5.1.1 不同类型的对象和组件 134 5.1.2 VBScript和JScript脚本对象 135 5.2 创建对象和组件实例 136 5.2.1 使用Server.CreateObject方法 136 5.2.2 使用<OBJECT>元素 136 5.2.3 Server.CreateObject与<OBJECT>的 区别 138 5.2.4 组件线程模型 138 5.2.5 引用对象类型库 139 5.2.6 在客户端上创建对象实例 140 5.3 Scripting.Dictionary对象 141 5.3.1 创建和使用Dictionary对象 141 5.3.2 Dictionary对象示例 143 5.4 Scripting.FileSystemObject对象 148 5.4.1 FileSystemObject对象成员概要 149 5.4.2 使用驱动器 151 5.5 Scripting.TextStream对象 161 5.5.1 创建TextStream对象的方法 161 5.5.2 TextStream对象成员概要 163 5.5.3 TextStream对象举例 165 5.6 小结 168 第6章 活动服务器组件 169 6.1 脚本对象与服务器组件的比较 169 6.2 ASP/IIS可安装组件 171 6.2.1 使用示例页面 172 6.2.2 Content Linking组件 173 6.2.3 Ad Rotator组件 177 6.2.4 Counters组件 182 6.2.5 Browser Capabilities组件 184 6.2.6 Content Rotator组件 188 6.2.7 Page Counter组件 190 6.2.8 Permission Checker组件 191 6.2.9 MyInfo 组件 194 6.2.10 Tools组件 195 6.2.11 Logging Utility组件 200 6.3 第三方服务器组件 204 6.3.1 BrowserHawk组件 204 6.3.2 SA-FileUp组件 206 6.3.3 RegEx注册表访问组件 207 6.4 小结 209 第7章 调试和错误处理 210 7.1 错误的种类 211 7.1.1 语法或“编译”错误 211 7.1.2 语义或“运行期”错误 215 7.2 各种运行期错误 218 7.2.1 逻辑错误 219 7.2.2 脚本运行期错误 220 7.2.3 ASP和SSI的运行期错误 221 7.2.4 客户端脚本错误 222 7.3 防止错误 224 7.4 处理错误 229 7.4.1 ASP缺省错误处理器 229 7.4.2 VBScript错误处理 230 7.4.3 JScript错误处理 232 7.4.4 使用IIS错误页面 232 7.5 程序调试—发现及处理错误 238 7.5.1 常规调试技术 238 7.5.2 Microsoft Script Debugger 239 7.5.3 获得ASP的帮助和支持 242 7.6 小结 243 第8章 ADO基础 244 8.1 ADO的定义 244 8.1.1 OLE DB和ADO的体系结构 245 8.1.2 消费者与提供者 246 8.1.3 提供者和驱动程序 247 8.2 ADO 2.5对象模型 248 8.2.1 Connection对象 248 8.2.2 Command对象 249 8.2.3 Recordset对象 249 8.2.4 Record对象 249 8.2.5 Stream对象 250 8.2.6 集合 250 8.2.7 ADO常数 252 8.3 连接到数据存储 252 8.3.1 连接字符串 253 8.3.2 使用包含文件 256 8.3.3 使用连接状态 256 8.3.4 连接语法 257 8.3.5 连接的例子 257 8.3.6 连接缓冲池 257 8.4 记录集 258 8.4.1 光标 258 8.4.2 锁定 260 8.4.3 创建记录集 261 8.4.4 过滤记录集 265 8.4.5 查找记录 266 8.4.6 修改记录 267 8.5 管理错误 269 8.5.1 Errors集合 269 8.5.2 ASP页面中的ADO错误 270 8.6 小结 272 第9章 连接、命令和过程 273 9.1 Connection对象 273 9.1.1 返回一个记录集 273 9.1.2 操作命令 274 9.2 Command对象 274 9.2.1 返回记录集 274 9.2.2 操作命令 275 9.2.3 存储过程 276 9.3 优化 289 9.3.1 常用的ADO技巧 289 9.3.2 对象变量 289 9.3.3 高速缓存大小 290 9.3.4 数据库设计 290 9.3.5 数据高速缓存 291 9.4 数据整形 293 9.4.1 使用数据整形 294 9.4.2 性能 297 9.5 小结 298 第10章 ASP与客户端数据 299 10.1 断开连接的记录集 299 10.2 远程数据服务 300 10.2.1 RDS服务器组件 300 10.2.2 RDS客户组件 301 10.2.3 支持RDS的浏览器 301 10.2.4 数据源对象 301 10.2.5 数据绑定 308 10.2.6 更新数据 316 10.3 在服务器和客户之间传输数据 319 10.3.1 基于服务器的组件 319 10.3.2 DataSpace对象 320 10.3.3 使用服务器端组件的优点 322 10.3.4 注册服务器端组件 322 10.3.5 自定义处理器 323 10.4 记录集分页 326 10.4.1 利用ASP页面分页记录集 327 10.4.2 利用ADO分页 330 10.4.3 利用SQL Server完成记录集分页 333 10.4.4 数据分页小结 336 10.5 使用数据库中的图像 337 10.6 小结 338 第11章 使用XML数据 339 11.1 XML的定义 339 11.1.1 XML和HTML的差别 340 11.1.2 标记和元素 343 11.1.3 模式和文档类型定义 346 11.1.4 名称空间 347 11.1.5 文档对象模型 348 11.2 ADO和IE5中的XML 354 11.2.1 存储为XML形式的ADO记录集 354 11.2.2 ADO记录集名称空间 355 11.2.3 ADO记录集模式 355 11.2.4 IE数据岛和绑定 358 11.2.5 以XML数据格式保存记录集 361 11.2.6 打开记录集 365 11.3 用XSL来设计XML 367 11.4 相关的领域 371 11.5 用于SQL Server的XML技术预览 372 11.6 小结 373 第12章 通用数据访问 375 12.1 UDA的构想 375 12.2 OLE DB提供者 376 12.2.1 Indexing Service 376 12.2.2 活动目录 383 12.2.3 Exchange Server 386 12.2.4 定制的提供者 386 12.3 半结构化的数据 389 12.3.1 Record对象 390 12.3.2 Internet 发布 390 12.3.3 WebDAV 401 12.4 企业数据 401 12.4.1 Access和SQL Server二者取一 402 12.4.2 SNA Server和传统数据访问 404 12.5 企业中的ASP 405 12.6 小结 407 第13章 组件和网络应用程序结构 408 13.1 分布式应用程序的结构 408 13.1.1 分层应用程序 408 13.1.2 Windows DNA 410 13.1.3 Windows DNA服务 411 13.1.4 网络结构 413 13.2 组件 415 13.2.1 组件定义 415 13.2.2 COM和COM+ 415 13.2.3 组件服务 416 13.2.4 以数据为中心的组件 417 13.2.5 业务组件 417 13.2.6 用户界面组件 418 13.3 组件应用程序设计 418 13.3.1 转换到组件 419 13.3.2 应用程序设计 419 13.3.3 设计网络组件 420 13.3.4 组件设计 422 13.3.5 组件集成 423 13.3.6 建立组件 424 13.4 应用程序设计范例的研究 425 13.4.1 明确问题 425 13.4.2 应用程序的设计 426 13.4.3 设计权衡 430 13.4.4 设计小结 431 13.5 小结 432 第14章 COM、COM+和ASP 433 14.1 COM的内容 433 14.1.1 COM无处不在 434 14.1.2 COM+的三个方面 434 14.1.3 COM开发工具 436 14.2 接口 437 14.2.1 组件 438 14.2.2 缺省接口 438 14.2.3 GUID—实体的确定名称 439 14.2.4 接口的详细内容 439 14.2.5 IUnknown接口 442 14.2.6 使用IDispatch—后期绑定 442 14.2.7 组件信息的中央存储库 444 14.3 COM+运行期的变化 446 14.3.1 配置的和非配置的组件 447 14.3.2 COM+类别 447 14.4 创建一个ASP COM组件 447 14.4.1 组件的接口 449 14.4.2 创建组件 449 14.5 小结 457 第15章 COM+应用程序 458 15.1 微软组件服务(COM+) 458 15.1.1 拦截原理 459 15.1.2 COM+结构 461 15.1.3 组件/对象的生存期和状态 464 15.2 单元和线程模型 467 15.2.1 线程 467 15.2.2 单元 468 15.2.3 线程模型的属性 470 15.2.4 线程模型和范围 472 15.3 COM+应用程序 476 15.3.1 ObjectContext接口 476 15.3.2 Visual Basic COM+组件 479 15.4 组件服务 487 15.5 组件的调试 494 15.6 小结 496 第16章 ASP脚本组件 497 16.1 使用WSC的环境 497 16.2 一个Windows脚本组件 498 16.2.1 发展历史 498 16.2.2 HelloWorld WSC 499 16.3 WSC的结构 499 16.3.1 描述层 500 16.3.2 脚本层 503 16.3.3 运行期层 504 16.4 可用的接口 504 16.5 编写一个ASP脚本组件 505 16.5.1 AspTable组件 506 16.5.2 使用AspTable对象 511 16.6 ASP脚本组件的特点 513 16.6.1 选择正确的工具 513 16.6.2 脚本组件与VBScript类的比较 513 16.7 小结 514 第17章 用C++建立ASP组件 515 17.1 C++语言 515 17.1.1 C++简史 515 17.1.2 使用C++的原因 516 17.1.3 不使用C++的原因 517 17.1.4 把ASP技巧转到C++上 517 17.2 VC++库 518 17.2.1 微软基础类库 518 17.2.2 活动模板库 519 17.2.3 标准模板库 519 17.3 建立一个C++服务器组件 521 17.3.1 问题 522 17.3.2 设计 522 17.3.3 实现 522 17.3.4 测试 531 17.3.5 错误处理 533 17.3.6 调试 535 17.4 小结 537 第18章 对C++组件的进一步讨论 538 18.1 与ASP进行接口 538 18.2 与COM+进行接口 543 18.2.1 IObjectContext的事务处理 546 18.2.2 IObjectControl的对象缓冲 547 18.3 数据访问 547 18.3.1 通过C++使用ADO 548 18.3.2 OLE DB消费者模板 553 18.3.3 使用ADO,还是使用OLE DB消费者 模板 557 18.4 小结 557 第19章 ASP和事务性Web应用程序 558 19.1 事务处理的定义 558 19.1.1 保持应用程序的完整性 558 19.1.2 ACID属性 559 19.2 分布式事务 560 19.3 事务性COM+应用程序 562 19.3.1 Transaction Support属性 562 19.3.2 活动与同步 564 19.3.3 事务的生存期 567 19.3.4 事务访问自定义资源 573 19.4 COM+事务和IIS 574 19.4.1 事务性ASP 574 19.4.2 事务性ASP中的ObjectContext 对象 575 19.4.3 事务事件 576 19.5 用ASP和COM+进行联机订购 577 19.5.1 业务需要 577 19.5.2 设计 577 19.5.3 实现 578 19.5.4 程序验证 585 19.6 小结 586 第20章 ASP和消息队列服务器 587 20.1 消息排队的定义 587 20.1.1 MSMQ的定义 588 20.1.2 使用MSMQ和ASP的原因 589 20.2 MSMQ结构 591 20.2.1 服务器类型 591 20.2.2 客户类型 592 20.2.3 站点布局图 593 20.2.4 投递选项 593 20.3 管理MSMQ 594 20.3.1 增加队列 594 20.3.2 消息队列的属性 596 20.3.3 消息属性 597 20.4 MSMQ对象模型 599 20.4.1 MSMQApplication对象 600 20.4.2 MSMQQuery对象 600 20.4.3 MSMQQueueInfos集合 601 20.4.4 MSMQQueueInfo对象 601 20.4.5 MSMQQueue对象 602 20.4.6 MSMQMessage对象 603 20.4.7 MSMQEvent对象 605 20.4.8 MSMQTransaction对象 605 20.4.9 MSMQTransactionDispenser对象 605 20.4.10 MSMQCoordinatedTransaction Dispenser对象 606 20.4.11 访问MSMQ的其他方式 606 20.5 用于MSMQ的MS DTC事务 606 20.6 高级MSMQ消息 606 20.7 COM+队列化组件 609 20.8 扩展联机订货的示例 610 20.8.1 在组件中添加MSMQ 610 20.8.2 处理队列化订单 612 20.9 小结 614 第21章 ADSI和AD介绍 615 21.1 ADSI的用途 615 21.2 必需的软件 616 21.3 AD的内部结构 617 21.3.1 目录里的对象和属性 617 21.3.2 对象的类 618 21.3.3 容器和叶 619 21.3.4 模式 619 21.3.5 继承 620 21.4 目录的特征 622 21.4.1 优化查找 622 21.4.2 查找功能 622 21.4.3 开放性 622 21.4.4 事务处理 622 21.4.5 复制 623 21.5 常见目录 623 21.5.1 Netscape目录服务器 623 21.5.2 IIS元数据库 623 21.5.3 Exchange Server目录和站点服务器 成员目录 623 21.5.4 Netware目录服务 623 21.5.5 WinNT 623 21.6 ADSI的适用范围 624 21.7 LDAP的适用范围 625 21.8 绑定到一个ADSI对象 626 21.8.1 ADSI对象和Directory对象 626 21.8.2 查看ADSI对象的属性 627 21.9 浏览目录:枚举容器的所有子对象 628 21.10 使用模式定义的属性 631 21.11 Get和GetEx 634 21.12 PropertyBrowseEx示例 634 21.13 AD与WinNT提供者比较 636 21.14 属性缓存 638 21.15 设置属性的值 639 21.16 目录的验证 639 21.17 查找 641 21.17.1 用以查找ADSI目录的命令字符串 644 21.17.2 查找过滤器 645 21.18 小结 646 第22章 ASP和用于NT服务器的CDO 647 22.1 CDO是什么 647 22.2 使用CDO的原因 647 22.2.1 NT服务器下的CDO 648 22.2.2 CDO与CDONTS的比较 648 22.2.3 CDO for Windows 2000 649 22.3 CDONTS库 649 22.3.1 引用类型库 650 22.3.2 NewMail对象 651 22.3.3 其他的CDONTS对象 658 22.3.4 设置SMTP Service 666 22.3.5 SMTP Service配置 667 22.4 在ASP应用程序中使用CDONTS 670 22.4.1 简单邮箱应用程序 671 22.4.2 Inbox应用程序 676 22.5 小结 683 第23章 ASP、CDO与Exchange Server 684 23.1 CDO库 684 23.1.1 通用/共享对象 684 23.1.2 Session对象 695 23.1.3 文件夹 697 23.1.4 地址列表 698 23.1.5 信息存储 699 23.1.6 消息 699 23.1.7 通用属性 704 23.2 邮件客户端应用程序 705 23.2.1 概述 705 23.2.2 服务器配置 705 23.2.3 类型库 707 23.2.4 Login.asp 707 23.2.5 FrameSet.asp 708 23.2.6 FolderList.asp 709 23.2.7 MessageList.asp 712 23.2.8 ViewMessage.asp 715 23.2.9 SendMessage.asp 719 23.2.10 SendMail.asp 722 23.2.11 Logout.asp 725 23.3 小结 725 第24章 服务器防护 726 24.1 安全的定义 726 24.1.1 Internet上的安全问题 726 24.1.2 安全策略 728 24.2 Windows 2000的防护 730 24.2.1 磁盘格式 730 24.2.2 Window 2000安全检查列表 730 24.2.3 防火墙和代理服务器 737 24.3 IIS 5.0的防护 739 24.3.1 IIS的安全配置 739 24.3.2 验证方法 742 24.4 SQL Server 7.0和ODBC的安全 744 24.4.1 保护sa帐号 744 24.4.2 为数据库访问建立替代帐号 744 24.5 建立自己的ASP安全系统 746 24.6 小结 755 第25章 证书的使用 756 25.1 安全性、一致性和可靠性 756 25.2 证书与证书机构 759 25.3 从证书机构获取证书 762 25.4 使用证书 768 25.4.1 使用服务器证书 768 25.4.2 使用个人证书 768 25.4.3 使用软件发行者证书 769 25.4.4 客户证书映射 769 25.4.5 证书的生存期 772 25.5 管理证书 772 25.5.1 证书存储 772 25.5.2 IIS证书管理 774 25.5.3 IE证书管理 775 25.5.4 Outlook Express证书管理 776 25.6 证书与ASP 776 25.7 成为自己的证书机构 777 25.7.1 Certificate Services 778 25.7.2 建立证书机构 779 25.7.3 管理证书机构 779 25.7.4 与证书机构的交互 780 25.8 小结 781 第26章 优化ASP的性能 782 26.1 衡量工作性能的标准 782 26.1.1 吞吐量 782 26.1.2 响应时间 783 26.1.3 衡量性能的其他指标 784 26.2 改善服务器的硬件性能 786 26.2.1 内存 786 26.2.2 硬盘 787 26.2.3 网络带宽 787 26.2.4 CPU 787 26.2.5 更多的服务器 787 26.3 性能的调整 787 26.3.1 解决性能问题 787 26.3.2 强度工具 788 26.3.3 脚本优化 789 26.3.4 会话和应用程序状态 789 26.3.5 安全套接字层 793 26.3.6 进程隔离 793 26.3.7 缓存技术和字典 794 26.3.8 数据库性能 795 26.3.9 真正充足的时间:MSMQ 796 26.3.10 脚本与组件的比较 796 26.3.11 多处理器的可扩展性 798 26.3.12 线程闸门 800 26.3.13 设置元数据库 801 26.3.14 性能计数器 802 26.4 各种小技巧 805 26.4.1 Stm的重命名技巧 805 26.4.2 避免嵌套的包含 806 26.4.3 不使用非脚本映射的文件扩展名 806 26.4.4 关闭脚本调试器 806 26.4.5 最小化脚本块转换 806 26.4.6 不要混用脚本引擎 807 26.4.7 在“费时”操作前使用Response.Is Client Connected 807 26.4.8 使用<OBJECT>标记 808 26.4.9 不使用OnStartPage和OnEndPage 808 26.4.10 发挥客户端的作用 808 26.5 小结 808 第27章 建立多服务器网站 810 27.1 多服务器网站 810 27.1.1 Web阵的不足 811 27.1.2 Web阵基础 812 27.2 负载平衡模式 813 27.2.1 DNS循环复用法 813 27.2.2 硬件负载平衡 814 27.2.3 TCP/IP Network Load Balancing 817 27.2.4 复合方式 819 27.2.5 High Availability Clustering Service 820 27.2.6 COM+Dynamic Load Balancing 822 27.3 状态管理 824 27.3.1 不管理状态 824 27.3.2 客户端存储 824 27.3.3 亲和性 824 27.3.4 在一个中心服务器上存储状态 826 27.4 安全 826 27.5 小结 827 第28章 XML驱动的报纸实例 829 28.1 报纸的剖析 829 28.1.1 作者写稿 831 28.1.2 编辑修改 832 28.1.3 读者阅读 834 28.1.4 结构要求 835 28.2 网站的大脑:settings.xml 835 28.2.1 <Specifications>元素 836 28.2.2 <colors>元素 836 28.2.3 <navigation>元素 836 28.2.4 准备global.asa 837 28.2.5 插入导航 838 28.2.6 <content>和<glossary>元素 840 28.3 网站的躯干:headlines.asp 841 28.3.1 ShowHeadlines过程 842 28.3.2 ShowBlurbs过程 843 28.3.3 ShowBriefs过程 844 28.3.4 ShowStory过程 846 28.3.5 使用ShowStory过程 849 28.3.6 主页 852 28.4 管理工具 854 28.4.1 setting_stories.asp 854 28.4.2 setting_glossary.asp 858 28.4.3 关于admin文件夹的其他内容 861 28.5 系统集成 861 28.6 小结 864 附录A ASP 3.0的对象模型 865 附录B 脚本运行期库对象 871 附录C 微软服务器组件 877 附录D 错误代码 881 附录E ADO 2.5对象模型 893 附录F ADO 2.5常量 902 附录G 有用的资料 920 附录H p2p.wrox.com 926
OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别与检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123axj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值