基于多核编程案例分析_第1页
基于多核编程案例分析_第2页
基于多核编程案例分析_第3页
基于多核编程案例分析_第4页
基于多核编程案例分析_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于多核编程的案例分析多核架构及编程技术基于多核编程的案例分析 .net环境下,多线程tcp服务案例 c/s模式下多媒体socket通信(mfc)(pc embedded platform).net环境下,多线程tcp服务 多线程客户端连接处理 对多个客户端连接采用线程安全收集对象进行集中管理。 回收垃圾线程 工具: microsoft .net framework sdk c# c# complier 包含文件:tcpserver.cstcpserver2.cstcpserver2b.cstcpserver3.cstcpclienttest.cs可以从课程网站上可以从课程网站上下载源代码下载

2、源代码tcp类using system.net.sockets; /namespacetcplistener listener = new tcplistener(portnum);listener.start();tcpclient handler = listener.accepttcpclient();int i = clientsockets.add ( new clienthandler(handler) ) ; (clienthandler) clientsocketsi).start() ;客户端socket处理线程客户端连接实例集监听线程回收线程为每个已经接收的连接产生一个线程

3、tcp客户端请求垃圾线程将被回收允许tcp服务接收客户端的连接请求。分别为每个请求产生一个线程实例。并启动。线程安全收集 关于管理客户端连接,特别是在主tcp线程结束之前,回收垃圾线程的时候,用arraylist作为线程安全的收集器。private static arraylist clientsockets ;lock ( clientsockets.syncroot ) int i = clientsockets.add ( new clienthandler(handler) ) ; (clienthandler) clientsocketsi).start() ;线程同步线程同步垃圾线

4、程回收 在典型的tcp服务环境中,许多客户端向服务端向服务器发起连接。而许多客户端同时会断了连接,此时这些断了的连接还占有服务器端系统资源,应该被释放掉。如果没有回收策略的话,服务器将很快超载。 垃圾线程需要回收。 回收同时,需要注意线程同步。垃圾线程回收方法threadreclaim = new thread( new threadstart(reclaim) );threadreclaim.start() ;private static void reclaim() while (continuereclaim) lock( clientsockets.syncroot ) for ( i

5、nt x = clientsockets.count-1 ; x = 0 ; x- ) object client = clientsocketsx ; if ( !( ( clienthandler ) client ).alive ) clientsockets.remove( client ) ; console.writeline(a client left) ; thread.sleep(200) ; 安全关闭服务 在关闭服务之前,应该把所有的连接都关闭掉。continuereclaim = false ; threadreclaim.join() ; foreach ( objec

6、t client in clientsockets ) ( (clienthandler) client ).stop() ; 线程池 当客户端的连接多了以后,会严重影响系统性能。 线程池的利用可以有效管理所产生的这些线程。减小开销,增加性能。 在线程池中将任务重新分配。 线程池中线程数量有限制 即使没有限制,线程过多,也会使cpu负载过大而死机。 / schedule task again if ( sharedstateobj.continueprocess & !bquit ) threadpool.queueuserworkitem(new waitcallback(this.

7、process), sharedstateobj);else networkstream.close(); clientsocket.close(); / deduct no. of clients by one interlocked.decrement(ref sharedstateobj.numberofclients ); console.writeline(a client left, number of connections is 0, sharedstateobj.numberofclients) ; / signal main process if this is the l

8、ast client connections / main thread requested to stop.if ( !sharedstateobj.continueprocess & sharedstateobj.numberofclients = 0 ) sharedstateobj.ev.set();用队列管理多线程任务处理任务处理任务处理fifo队列结构客户端请求任务监听线程当客户端请求到达,将请求放到队列中。class clientconnectionpool / creates a synchronized wrapper around the queue. privat

9、e queue syncdq = queue.synchronized( new queue() );class clientservice const int num_of_thread = 10; private clientconnectionpool connectionpool ; private bool continueprocess = false ; private thread threadtask = new threadnum_of_thread ; public clientservice(clientconnectionpool connectionpool) th

10、is .connectionpool = connectionpool ; public void start() continueprocess = true ; / start threads to handle client task for ( int i = 0 ; i 0 ) client = connectionpool.dequeue() ; if ( client != null ) client.process() ; / provoke client / if client still connect, schedufor later processingle it if

11、 ( client.alive ) connectionpool.enqueue(client) ; thread.sleep(100) ; 案例小结 共提出了三种方法来实现tcp多线程连接: 第一种方法: 可以控制每一个线程,但是当产生很多线程的时候,会影响系统性能。 第二种方法: 系统性能会好一些,但是对所产生的线程的控制性差一些。 第三种方法: 性能好,控制灵活。基于多核编程的案例分析 .net环境下,多线程tcp服务案例 c/s模式下多媒体socket通信(mfc)(pc embedded platform)c/s模式下多媒体socket通信 内容: 案例介绍 软件设计 优化过程介绍

12、目的: 熟悉基于多核的编程及优化技术,并将其与嵌入式平台程序优化技术相联系。复习基于嵌入式平台的编程技术。 介绍: 采用c/s模式(服务器端/客户端)。 只有一个server,但有多个client。 服务器端:pc & 多核pc 客户端:嵌入式平台(多台) 双向通信。 传输多媒体信息,如图片。 服务器端有独立ip地址。 客户端采用gprs模块介入internet。 采用socket通信机制。 服务器端程序:visual c+ 6.0或者 c 客户端程序: embedded visual c+ 4.0 & sp1 & sp2 & sp3为什么采用这个案例通过这个案

13、例,我们可以进一步熟悉和掌握: 基于socket机制的网络通信编程 网络通信的阻塞和非阻塞机制的区别 tcp/ip通信中数据包包头的重新封装。 因为客户端是通过gprs接入internet,此时即使采用可信连接的tcp协议,当采用多线程时仍然会产生严重的丢包现象(此时数据包必须小于1.2k)。所以需要对所传输的内容进行纠错。 创建和销毁线程的方法 内存泄漏的处理 基于多核的编程工具的使用 intel多核编程工具包对程序的优化方法 共享内存的处理 可以对单核多线程与多核对线程进行比较 对嵌入式平台开发而言: 单核多线程的编程方法 通过gprs介入internet的方法 创建和销毁线程 等等软件设

14、计 服务器端软件设计: 服务器端有一个主线程 支持同时多个客户端的连接,为每个客户端建立一个线程。 建立连接后,采用socket方式从客户端接收或发送至客户端:图片等多媒体信息。 当客户端采用多线程发送的时候,服务器端程序接收线程对接收数据包部分并行处理,每个新线程所接收的内容都按照socket包头信息放置,等所有线程均结束后对所接收的内容进行重组还原。软件设计 客户端软件设计 客户端有一个主线程 为发送和接收创建线程 目的:不阻塞用户界面的操作 为发送和接收的数据包大小和百分比,建立线程用进度条显示。 采用tcp协议对服务器进行操作。 对发送的数据包进行包头的重构。服务器端 主线程:管理程序

15、状态 空闲任务线程:管理队列 事件线程:监听socket请求,一旦有接入,就交给任务线程。 任务线程:有多个,根据接入请求的多少来定。 采用临界端(critical section)进行同步处理。 采用openmp库函数服务器端程序界面服务器端程序界面协议栈客户端: 主线程:管理程序状态 数据包包头重新封装。(传输速度会受影响,但是质量得到了保证。否则在传图片时会出现缺失、移位等现象) 任务线程: 发送线程 接收线程 显示进度条的线程 采用临界段进行同步处理ctcpclient_ce:ctcpclient_ce() /初始化socket环境 wsadata wsd; wsastartup(ma

16、keword(1,1),&wsd); /创建线程退出事件句柄 m_exitthreadevent = createevent(null,false,false,null); m_brec = true;/*-【函数介绍】: 用于打开客户端socket【入口参数】: pwnd用于指定父窗口句柄【出口参数】: (无)【返回 值】: true:打开成功;false:打开失败-*/bool ctcpclient_ce:open(cwnd * pwnd) /复位线程退出事件 resetevent(m_exitthreadevent); /存储父窗口句柄 m_pownerwnd = pwnd; /

17、创建tcp套接字 m_socket = socket(af_inet,sock_stream,ipproto_tcp); if(m_socket = socket_error);return false; /创建通讯线程 m_tcpthreadhandle = createthread(null,0,socketthreadfunc,this,0,null); if (m_tcpthreadhandle = null) closesocket(m_socket); return false; return true; 常用库 osmutex类:封装不同操作系统对线程同步支持的差异 osthre

18、ad类:封装并且定义了使用线程的方式 oscond类:状态变量 socket类: eventcontext eventthread socket udpsocket tcpsocket tcplistenersocket代码分析:调度策略 任务调度: 排队 任务状态:运行、暂停、终止。开发过程程序调试通过启用和禁止程序中的openmp指导,使用二分搜索法找出引发故障等待必须结构。关闭/qopenmp编译开关,使用/qopenmp_stub开关来编译引发错误的子程序;然后检查代码中的故障是否发生在串行执行的过程中,如果是,就进行串行调试。使用/qopenmp开放编译引发错误的子程序,并设置环境变量omp_num_threads=1,然后检查故障是否发生在串行执行的过程中,如果是,就进行多线程代码的单线程调试。使用/qopenmp以及/od,/o1,/o2,/o3或/qipo中的某一个编译开关编译代码,在最低优化等级上找出故障场景。检查错误的代码段,定位问题。如果不能定位,使用/qtcheck开关编译代码进行openmp代码插桩,并在intel线程检查器中运行插桩的代码。intel线程检测器的使用 在本程序中: 发现数据竞争和死锁intel vtunetm的使用 找热点(hotspot)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论