zoukankan      html  css  js  c++  java
  • 线程同步与异步套接字编程

    线程同步与异步套接字编程

    事件对象:属于内核对象,可以实现线程同步

    事件对象的组成:使用计数

    标记是自动重置还是人工重置的布尔值

    标记处于通知状态还是未通知状态

    HANDLE CreateEvent(

    LPSECURITY_ATTRIBUTES lpEventAttributes,

    BOOL bManualReset,//人工还是自动重置,true人工,false自动

    BOOL bInitialState,//事件初始状态,true有信号,false没信号

    LPCTRSTR lpName//事件对象的名称

    )

    关闭事件对象:CloseHandle(HANDLE hHandle)

    设置事件对象为有信号状态:

    SetEvent(HANDLE hEvent)

    重置事件对象状态:

    ResetEvent(HANDLE hEvent)

    人工重置的事件对象,当事件为有信号状态时,所有等待该对象的线程都变成可调度线程,被某个线程得到后还是有信号状态

    自动重置的事件对象,当事件为有信号状态时,只有一个线程变成可调度线程,被某个线程等到后,操作系统会讲该事件设置为无信号状态

    自动重置的事件,当对所保护的代码执行完成后,需要调用SetEvent函数将该事件对象设置为无信号状态

    为了实现线程间的同步,不应该使用人工重置的事件对象,而应该使用自动重置的事件对象

    通过创建一个命名的事件对象,可以实现应用程序只有一个实例运行的功能

    关键代码段:也称临界区,工作在用户方式下,是指一个小代码段,在代码能够执行前,它必须独占某些资源的访问权。通常把多线程中访问同一资源的那部分代码当做关键代码段

    void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

    void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

    void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

    void DeleteCriticalSection(LPCRITICAL _SECTION lpCriticalSection)//参数作为返回值使用

    线程死锁:对于多线程,都在等待对方所占用的资源

    互斥对象和事件对象都属于内核对象,速度较慢,可以在多个进程中的各个线程间进行同步

    关键代码段在用户方式下,同步速度较快,但很容易进入死锁状态,因为在等待进关键代码段时,无法设定超时值

  • 相关阅读:
    伯努利数学习笔记
    bzoj 3864: Hero meet devil(dp套dp)
    CF1137E. Train Car Selection(可删堆)
    洛谷P3779 [SDOI2017]龙与地下城(概率论+Simpson+FFT)
    洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
    AtCoder Grand Contest 030题解
    Sort函数(C++)
    堆排序
    十进制--->二进制(利用C++栈功能)
    对局匹配
  • 原文地址:https://www.cnblogs.com/xiaoxiaocaicai/p/3595334.html
Copyright © 2011-2022 走看看