对多线程网络编程的理解

本文主要涉及,线程的构建,线程之间的通信以及网络源端和目的端的通信接口的操作这三个问题。

一、线程的创建

对于线程的创建,首先要明确使用线程的目的,使用线程给我们的程序能够带来什么好处。结合我的经验,我认为使用线程的好处主要有:

1.线程是一个独立运行的个体,它可以独立完成我们交给它的任务,而不需要我们在程序中主动显式调用;

2.当程序处理的问题及逻辑庞大时,显然,线程可以降低主线程的复杂性,使程序逻辑较为清楚;同时,方便我们进行调试,根据线程ID,迅速找到问题;

3.对于现今多核CPU的发展,多个线程可以实现真正意义上的同时运行,这显然可以明显提高程序的运行效率和数据的处理效率(对于涉及到大量并行数据处理的程序而言)。

当然,以上三点的建立基础都来源于线程的良好设计与线程之间的良好分工,否则一切都免谈。因此,问题就转化为了我们如何来设计线程。我认为,设计定义线程的时候需要

考虑,线程所要完成的主要功能是什么,线程处理的数据有哪些,这并不是一件简单的事。进一步地,在编程的时候,我们必须要考虑数据的流向,数据的流向是由其实现的功

能所决定的,线程主要的数据来自哪里,是来自网络对端,还是来自本地。如果是来自网络对端,那么就必须明确通信接口,如常用的socket接口;如果是来自本地,那么数据

存放的空间在哪,该空间是否有我们要处理的数据,数据到来的检测一般有中断触发和周期性探测两种方式。周期性检测相对较为简单一些,可以设立一个定时器,在定时器超

时时调用数据检测函数去判断,进而触发相应的信号。线程捕捉该信号,进入数据处理流程。当然,必须明确的一点是定时器的实现也是一个独立的线程。

在明确了数据源之后,我们便可以设计数据处理过程了。这个时候,要考虑的是,数据的处理逻辑,数据的作用域,该数据最终存储的空间等问题。处理逻辑可以按照功能设计

一系列的处理函数,针对不同的情形显式调用就可以。数据的作用域包括数据的类型,static或是extern,是否是const类型,数据声明的位置是在哪个具体的函数,这个函数在

哪里结束等。

数据的存储就是数据的去向,是存储在内存中,数据库中,还是某个文件中,对于不同的存储去向,其相应的访问权限是什么?别的线程是否可以访问,是否可以修改,访问的

时候是否需要添加信号量保护包括或是上锁保护。

最后,当线程进行完此轮数据处理之后,线程的进一步状态是什么,是退出,还是阻塞在某个信号上,或是某个结束标志上,如isStop=0或是1,通过改变这个变量,进而决定

线程的生存状态。

二、线程之间的通信

线程之间的通信一直是一个比较困难的问题,《unix网络编程卷2》也对进程间通信方式做了很多的讲解,一般主要有FIFO,socket,共享内存,消息队列,信号量等方式,对于这

块内容,我也一直在学习的过程中,linux中非常好用的重定向工具就是FIFO思想的最好体现,socket可以实现源端和目的端的通信,源和目的不一定在两台主机上,在一台主

机上只要四元组信息(源IP地址,源端口,目的IP地址,目的端口)不完成相同即可,消息队列还没有使用过,共享内存个人理解的一种简单实现方式创建全局变量,不同线程通

过互斥量访问修改这个全局变量,进而实现线程同步。信号量的使用和互斥量类似。

三、网络源端和目的端的通信接口的操作

对于这一点,我个人的体会是,在编程前就像拿着手机打电话一样,每个手机就代表一个通信接口,想清楚程序是和谁要进行通信的,对端的手机号是多少,我要和多少人进行

通信,是否需要不同的手机去通信,在程序中,就是定义UdpSocket或是TcpSocket的问题,一个手机就是一个socket的,手机号就是IP地址+端口号,当想清楚这个问题之

后,就可以通过不同的通信接口来拿到数据了。

这只是我在学习单服务器多客户端模式下编程时的一点思考,欢迎大家批评指正!

时间: 2025-01-02 11:18:46

对多线程网络编程的理解的相关文章

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

一站式学习Java网络编程 全面理解BIO/NIO/AIO

第1章 [开宗明义]网络编程三剑客BIO.NIO.AIO网络编程是RPC的奠基,RPC编程贯穿了程序员生涯的始终.本章首先分析为什么要学网络编,本课为谁设计,然后介绍课程内容主线脉络,让大家清晰知道本课程并非光说不练的假把式,而是处处有实战,实战项目步步优化,最后通过综合项目巩固所学.... 第2章 网络层的解析与协议本章首先对网络中涉及的网络链路层的解析进行讲解,进一步引出网络基本协议知识.使学员了解分层思想,对三种协议的定位及作用有所了解. 第3章 解读java.io专业术语也可以变得生动精

一站式学习Java网络编程 全面理解BIO/NIO/AIO完整版

一站式学习Java网络编程 全面理解BIO/NIO/AIO 资源获取链接:点击获取完整教程 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题,以创新性的“对比式学习”搭建网络编程课程,课程主线清晰(网络层基础铺垫-->java网络编程前置技术讲解-->阻塞式编程BIO-->非阻塞式编程NIO-->异步编程AIO-->综合实战)适合每一位需要理解网络编程的同学们学习.以“项目驱动”为导向的学习,与企业刚需灵魂契合. 适合人群 网络编程作为编程者的必备

多线程 网络编程 文件上传案例多线程

Day13 多线程 3).多线程的好处: 提高程序的运行效率,提高用户的体验度. 创建新的线程: *    定义类继承Thread *    重写方法run *    创建Thread子类的对象 *    调用子类对象的方法 start() * *  为什么继承Thread *    Thread类是线程对象类 *    继承了Thread,子类也是线程对象 * *  为什么重写run *    Sun工程师,不清楚其他人员用线程做什么 *    全部写在run中 * *  为什么调用start

【分享】一站式学习Java网络编程 全面理解BIO

  第1章 学习指南[课程提供1000+问题与答案库] 本章会介绍课程内容和具体收获,以及如何更好的学习本门课程,还会介绍项目需求,让大家了解课程最终使用Flutter实现一个怎样的项目,最后会对项目中所用到的技术做一个剖析,可提前知晓本门课程的重点技术内容[学习困惑有人帮,不用自己瞎摸索,问答区的问题有问必答]... 1-1 课程介绍与学习指南试看 1-2 项目需求分析,技术分解 第2章 Flutter学习经验:Flutter快速上手指南 本章将从开发语言.开发工具.布局.第三方库等方面教你如

TCP/IP 网络编程的理解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议 对应于应用层 tcp协议 对应于传输层 ip协议 对应于网络层 三者本质上没有可比性. 何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络中传输:而HTTP是

iOS 网络编程模式总结

IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为CFSocket.CFSocket是BSD sockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并与run loop集成,用来实现多线程网络编程和网络事件监听.基于 CFSocket可以实现各种类型的 socket编程,包括stream-based 的sockets(

IOS网络编程

目录 概述——对IOS网络编程的理解 概述——对IOS网络编程的理解

cocos2d-x网络编程

在这里我整理了以往自已用的一些关于HTTP和Socket编程资料,当然也有一些自已对网络编程的理解 首先说说HTTP与Socket概念性的一些认识: Socket通常称为“套接字”,用于描述IP地址和端口. 套接字类型分为: 1>,流式套接字:提供面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按顺序接收,基于TCP协议 2>,数据报式套接字:提供无连接服务,数据以独立形式发关,不提供无错保证,接必顺序混乱,基于UDP协议 Socket是对TCP/IP协议的封装和应用,它本身并不是协