【API】网络编程模型、多线程

摘要:
调用WSAsyncSelect函数将套接字自动设置为非阻塞模式,注册网络事件WSACreateSelect()/WSAEventSelect()2)等待网络事件发生WSAwaitForMultipleEvents()3)获取网络事件WSAwaitForMultipleEvents()4)手动设置信号量并释放资源WSAResetEvent(),以使用内核对象完成端口模型的调度。
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】网络编程模型、多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分布式项目报错及解决xming + putty 搭建远程图形化ssh访问ubuntu 14.04下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

httpd三种MPM的原理剖析

apache httpd系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文专讲httpd MPM。为了更完整、权威,我先把apache httpd 2.4关于prefork、worker和event的官方手册大致翻译了一遍,也就是本文的前3节。水平有限,难免翻译的"鬼才看得懂",还请见谅。...

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原...

mysql_【MySQL】常见的mysql 进程state

Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE )。 checking permissions 线程是检查服务器是否具有所需的权限来执行该语句。 Checking table 线程正在执行表检查操作。 cleaning up 线程处理一个命令,并正准备以释放内存和重置某些状态变量。 closing tabl...

.NET 程序内存占用问题

1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多 2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。 5、发布的时候选择Rele...

XAML: 在 MVVM 模式中,关于绑定的几处技巧

    以下会提到三个绑定的技巧,分别是 在 ListView 中为 ListViewItem 的 MenuFlyout 绑定 Command; 在 ListView 的 事件中绑定所选择项目,即其 SelectedItem属性; 处理文本控件与数值属性绑定中默认值0的问题; 一、在 ListView 中为列表项的 MenuFlyout 绑定 Comm...

ReactNative--组件的样式

设置组件的样式,讲解三种: 1 内联样式 2 对象样式 3 选择器样式 注意:在React和HTML5中设置样式时的书写格式是有一定区别的 1 HTML5以;结尾 React以,结尾 2 HTML中key,value都不加引号 React中属于JavaScript对象,key的名字不能出现"-",需要使用驼峰命名法。如果value为字符串,需要加引号...