【API】网络编程模型、多线程
1、网络通信编程
1)网络通信模型基础知识
- TCP
Server:
WSAStartup()
socket()
bind()
linsten()
accept()
send/recv()
closesocket()
WSACleanup()
Client:
WSAStartup()
socket()
connect()
recv/send()
closesocket()
WSACleanup()
- UDP
客户端A
socket()
bind()
send()
recv()
close()
客户端B
bind()
recv()
send()
close()
2)网络模型
- WSAAsyncSelect模型
创建窗口(CreateWindows)/对话框然后为该窗口提供一个窗口回调函数(WinProc)/对话框函数。
通过调用WSAsyncSelect函数自动将套接字设置为非阻塞模式,并注册一个或多个感兴趣的网络事件。
- WSAEventSelect模型
WSAEventSelect模型是以事件的形式通知应用程序。
1)创建事件对象,注册网络事件 WSACreateSelect()/WSAEventSelect()
2)等待网络事件发生 WSAwaitForMultpleEvents()
3)获取网络事件 WSAWaitForMultipleEvents()
4)手动设置信号量和释放资源 WSAResetEvent()
- 完成端口模型
利用内核对象的调度,使用少量的几个线程来处理和客户端的所有通信,从而消除线程上下文切换问题。当有事件产生时CPU能保证有资源可用,然后将这些事件加入到一个公共消息队列中去,当前哪一个线程空闲就去处理公共消息队列里的事件,如果没有事件了,线程就空闲下来。
1)初始化套接字组件 WSASocket()
2)绑定和监听 bind()
3)创建完成端口 CreateIoCompletionPort()
4)创建服务线程 GetSystemInfo()
5)连接客户端 accept()
6)套接字与完成端口关联 CreateIoCompletionPort()
7)将套接字与完成端口关联起来以后,应用程序调用发送数据/接收数据函数完成重叠IO操作
WSASend()/WSASendTo()
WSARecv()/WSARecvFrom()
8)等待重叠I/O操作结果 GetQueuedCompletionStatus()
9)投递完成通知 PostQueuedCompletionStatus()
2、多线程
原子
某一个线程对于某一个资源做操作的时候能够保证没有其他的线程能够对此资源进行访问。
Interlockedxxxxx
缺点:只能解决某个变量的问题,只能使一个整型数据做简单算数运算的时候是原子的。
临界区
临界区是使用EnterCriticalSection与LeaveCriticalSection形成一个保护区来保护代码,这一对函数保证,多个保护区的代码,同一时刻只能有一个保护区的代码在执行。
EnterCriticalSection()
LeaveCriticalSection()
缺点:临界区是在一个进程内有效的,无法在多线程的环境下进行同步。
互斥体
一个线程进入临界区,结果因为线程由于某些原因崩溃了临界区无法被释放,那么其他线程也无法进入临界区,全部被卡住。互斥体可以解决这些问题。
1、互斥体有两个状态,激发态和非激发态
2、有一个概念,叫做线程拥有权与临界区类似。
3、等待函数等待互斥体的副作用,将互斥体的拥有者设置为本线程,将互斥体的状态设置为非激发态。
CreateMutex()
OpenMutex()
WaitForSingleObject()
信号量
信号量是一种同步机制,对于一个信号量来说,它可以被加上多把锁,当所有的锁孔都被锁上,才不允许其他线程访问被信号量锁住的区域。
CreateSemaphore()
OpenSemaphore()
ReleaseSemaphore()
CloseHandle()
事件
可以设置等待函数对于此事件对象有没有副作用,也可以手动设置事件对象为激发态还是非激发态
CreateEvent()
OpenEvent()
SetEvent()
ResetEvent()
PulseEvent()
CloseHandle()
- 小结:
原子操作:简单的同步机制,只能对4个字节的数据进行算数运算
临界区:对一段代码实现保护操作,只能在一个进程中的不同线程使用。无法检测由于线程崩溃造成的临界区无法释放的问题。
互斥体:是一个内核对象,可以在不同进程的线程中实现对于一段代码的保护。能够检测由于线程崩溃造成的互斥体释放问题。只能被拥有者线程释放,故而多线程间的不同回调函数的同步使用互斥体可能会造成问题。
信号量:是一个内核对象,没有拥有者的概念,可以控制多个线程同时访问被保护的代码,并且给线程数量设置一个上限。
事件:是一个内核对象,没有拥有者的概念,可以封装自己的同步机制。
【API】网络编程模型、多线程的更多相关文章
- Linux IO模型和网络编程模型
术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- c/c++ 网络编程与多线程 编译参数
网络编程与多线程 编译参数 编译时要链接操作系统的pthread库 g++ -g socket01.cpp -std=c++11 -pthread 不加-pthread的话,出现下面的错误: term ...
- linux网络编程模型
1.编程模型 Linux网络编程模型是基于socket的编程模型
- TCP/IP网络编程之多线程服务端的实现(二)
线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...
- 网络编程之多线程——GIL全局解释器锁
网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- Java API —— 网络编程
1.网络编程概述 1)网络编程概述 · 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通 ...
- [国嵌攻略][090][linux网络编程模型]
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
- 谈谈传统BIO网络编程模型的局限性与NIO
先来看看我们的server端: 创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务: private void createListenSocket() { //如果 ...
随机推荐
- Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
https://blog.csdn.net/c406495762/article/details/75172850
- LVS(Linus Virtual Server):三种负载均衡方式比较+另三种负载均衡方式
还有个姊妹篇也可以参考这个文章:六大Web负载均衡原理与实现 什么是LVS (Linux Virtual Server)? 首先简单介绍一下LVS (Linux Virtual Server)到底 ...
- Luogu1641 SCOI2010生成字符串(组合数学)
NOI2018冒泡排序的一个子问题. #include<iostream> #include<cstdio> #include<cmath> #include< ...
- (转)C# Aop简单扫盲及ORM实体类属性拦截示例
转自: http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html 先说下场景,C#中为什么要使用Aop,而我又是在哪里使用Aop? ...
- MT【174】凹凸无妨
已知函数$f(x)=|x^3+3x^2-ax-b|$,对任意$a,b\in R$存在$x\in[-3,0]$使得$f(x)\le m$成立,求$m$的范围.求 $\displaystyle\min_{ ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- Winform Treeview 排序及图标处理
一.排序 1. 继承 IComparer 2. treeView1.TreeViewNodeSorter = this; 3. 实现IComparer public int Compare(ob ...
- 动态dp 板子
动态dp 瞎扯两句吧 先从序列上理解,维护链的最大独立集. 考虑是从左边转移的,那么矩阵的转移唯一,直接放在线段树上就可以了. 放在树上的话,儿子都可以转移,把轻儿子的转移放在子链链头更新,然后每条链 ...
- 前端学习 -- Css -- 选择器的优先级
当使用不同的选择器,选中同一个元素时并且设置相同的样式时,这时样式之间产生了冲突,最终到底采用哪个选择器定义的样式,由选择器的优先级(权重)决定优先级高的优先显示. 优先级的规则 内联样式 , 优先级 ...
- java保留两位小数和js保留两位小数一致性研究
一.java保留两位小数方式 public static void main(String[] args) { System.out.println("=======DecimalForma ...