孙鑫16线程同步与异步套接字bianc.txt

线程同步(利用互斥对象实现线程同步,稳定) 另两种线程同步的方法:事件对象,关键代码段
事件对象(也属于内核对象),包含三个成员:  
1.使用计数。
2.用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值。
3.用于指明该事件处于已通知状态还是未通知状态的布尔型。
事件对象有两种不同类型:人工重置的事件对象,自动重置的事件对象。
当人工重置的事件对象得到通知时,等待该事件对象的所有线程均变为可调度线程。
当一个自动重置的事件对象得到通知时,等待该事件对象的线程中只有一个线程变为可调度线程。
通过CreateEvent创建或打开一个命名的或匿名的事件对象。
设置事件对象状态 SetEvent函数将把指定的事件对象设置为有信号状态。
在使用事件对象实现线程间同步时,一定要注意区分人工重置事件对象和自动重置事件对象。当人工重置的事件对象得到通知时,等待该事件对象的所有线程均变为可调度线程;当一个自动重置的事件对象得到通知时,等待该事件对象的线程中只有一个线程变为可调度线程,同时操作系统会将该事件对象设置无信号状态,这样,当对所保护的代码执行完成后,需要调用SetEvent函数将该事件对象设置为有信号状态。而人工重置的事件对象,在一个线程得到该事件对象之后,操作系统并不会将该事件对象设置为无信号状态,除非显示地调用ResetEvent函数将其设置为无信号状态,否则该对象会一直是有信号状态。
关键代码段(关键代码段,也称为临界区):指一个小代码段,在代码能够执行前, 它必须独占对某些资源的访问权。
通常把多线程中访问同一种资源的那部分代码当做关键代码段。
相关API函数:
在进入关键代码段之前,首先需要初始化一个这样的关键代码段,可以调用InitializeCriticalSection函数实现。
1.InitializeCriticalSection
2.EnterCriticalSection
3.LeaveCriticalSection
4.DeleteCriticalSection
在利用多线程技术编写程序的过程中,在实现线程同步时一定要多加注意,应避免发生线程死锁。
三中线程同步方式,互斥对象、事件对象、关键代码段。
三种线程同步方式的区别:
1.互斥对象和事件对象都属于内核对象,利用内核对象进行线程同步时,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。
2.关键代码段工作在用户方式下,同步速度较快,但在使用关键代码段是,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值。
MFC调用关键代码段比较简单:类的构造函数中调用InitializeCriticalSection. 类的析构函数中调用DeleteCriticalSection. 需要保护的代码前面调用EnterCriticalSection. 访问完所需保护资源后,调用LeaveCriticalSection.
基于消息的异步套接字:Windows套接字在两种模式下执行I/O操作(阻塞、非阻塞)
在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回(不会将控制权交还给程)
在很多情况下,阻塞方式会影响应用程序的性能,有时需要非阻塞方式实现网络应用程序。
WSAAsyncSelect函数,该函数为指定套接字请求基于Windows消息的网络事件通知,并自动将该套接字设置为非阻塞模式。
WSAEnumProtocols Win32平台支持多种不同的网络协议,采用Winsock2就可以编写可直接使用任何一种网络协议的网络应用程序。通过WSAEnumProtocols函数可以获得系统中安装的网络协议的相关信息。
WSAEnumProtocols函数不能重复调用,传入缓冲区必须足够大以便能存放所有的元素。这个规定降低了该函数的复杂度,并且由于一个机器上装载的协议数目往往很少,因此并不会产生问题。
WSAStartup 函数将初始化进程使用的WS2_32.DLL。
WSASocket  Winsock库中的扩展函数WSASocket将创建套接字。
WSARecvFrom 接收数据报类型的数据,并保存数据发送方的地址。
为什么设置多个WSABUF结构体变量同时去接收数据?可以针对传送的信息,分别提供不同的缓冲区去接收,然后相应地取出缓冲区中的数据进行处理,这样就避免通过编码去切分字节流。这就是提供多个缓冲区同时接收数据的好处。(在已连串的字节流中,人为地定义前几个字节、中间几个字节,以及最后几个字节各自表示的含义).
WSASendTo
在编写网络应用程序时,采用异步选择机制可以提高网络应用程序的性能,如果在配合多线程技术,将大大提高所编写的网络应用程序的性能。








     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值