MSDN 同步部分 个人笔记

Posted joeylee97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSDN 同步部分 个人笔记相关的知识,希望对你有一定的参考价值。

(在知乎看到轮子哥说,掌握了MSDN上的并发部分 和 线程与进程部分就可以掌握所有语言的多线程编程,我在网上翻了一下并没有中文版,所以决定自己翻译一下...)

目录:

线程之间协同运行的方式有许多种,下面所述的函数提供了线程之间并发获取资源的方式。

  • 同步部分的新特性
  • 关于同步
  • 使用线程同步
  • 参考

同步部分的新特性:

Windows提供了下面的新特性:

Win8

EN
此内容没有您的语言版本,但有英语版本。

同步的新特性

 
DeleteSynchronizationBarrier

删除屏障同步

EnterSynchronizationBarrier
   进入屏障同步,让调用的线程等待当前屏障同步直到其中线程数目达到最大值。
GetOverlappedResultEx
   在规定时间内获取某一个文件或者明明管道,通信管道中重叠操作的结果。
InitializeSynchronizationBarrier
   规定一个屏障同步中最大线程数目

Specifies the maximum number of threads and spin count for a new synchronization barrier.

WaitOnAddress

等待地址中数据发生改变

WakeByAddressAll

唤醒所有等待该地址上数据发生改变的线程

WakeByAddressSingle

唤醒一个等待该地址上数据发生改变的线程

 

关于同步

为了同步获取资源,在等待函数中使用一个同步对象,同步对象的状态分为就绪状态和等待状态,等待函数允许一个线程阻塞自身直到某个特定的等待状态对象进入就绪态。

同步对象:
同步对象是一个句柄能够传入等待函数来协调多线程执行的对象,多个进程可以拥有同一个同步对象的句柄,为进程之间的通信提供了可能。

下列对象类型是专门为同步提供的:
事件类型:在事件发生的时候通知一个或者多个等待线程。
互斥量:能够在某一时刻被一个线程持有,使得线程之间能够协调获取共享资源。
信号量:维护一个不小于零的数值,来限制能够获取当前共享资源的线程数量。
等待计时器:通知一个或者多个线程等待时刻已到。

下列对象类型可以提供同步服务:
改变通告:当特定的改变在某个文件夹发生,状态被设置为就绪
终端输入:当终端输入缓冲区存在尚未读取的数据,被设置为就绪,当缓冲区为空,被设置为等待。
任务(Job):当任务重所有进程都超时结束的时候状态被设置为就绪态
内存资源通告:特定内存发生特定改变,状态被设置为就绪态。
进程:进程运行期间为等待,进程结束后设置为就绪态。
线程:运行期间为等待,结束后为就绪态。

特定情况下也可以使用文件,具名管道来当制作等待对象,但是这种用法不太好,我们可以选择使用异步IO来等待OVERLAPPED结构中的事件被设置为就绪,这样比直接使用事件

对象更加安全因为这样避免了多个重叠操作发生混淆(在同一个具名管道或者文件上的多个重叠操作),在这种情况下我们没有办法直到到底是什么行为将等待对象置为就绪态的。

 

 

等待函数:
等待函数使得一个线程阻塞其自身的运行直到达到特定的条件,等待函数的类型决定了标准的类型,当一个等待函数被调用,它检查是否达到了等待条件,如果没有达到就继续的等待直到超时或者被触发。

单个对象等待函数
要求一个指向等待对象的句柄,当满足下列条件之一的时候函数返回:
1.特定对象进入就绪状态
2.达到等待时间


多个对象等待函数
传入一个数组,当期这种一个进入就绪状态或者达到等待时间,函数返回
返回第一个就绪对的对象句柄

可选等待函数
特定条件满足的时候返回

注册等待函数
等待函数室友线程池的一个线程运行的,当特定条件达到的时候,毁掉函数会被线程池中的线程运行。
默认情况下,注册等待是一个多重等待操作,系统每次都会在时间进入就绪态之后重置它,如果我们要声明这个对象只要被调用一次,传入 WT_EXECUTEONLYONCE.


地址等待
线程可以使用地址等待函数来等待目标地址的值改变。函数当改变地址值得线程调用一个WakeByAddressSingle 的时候返回。


与等待对形象的关系
等待函数能够修改几种同步对象的状态。当着街对象进入就绪态导致函数返回的时候修改会发生,等待函数只能按照以下的几种写实来修改等待对象:
信号量的值减一
将胡质量,自动重置函数和状态改变对象的状态设置为等待状态
计时器设置为等待状态
手动重置时间,手动重置计时器,进程线程和终端输入对象不会被等待函数修改

创建窗口

 


在使用等待函数创建窗口的时候一定要小心,如果一个线程创建了窗口,那么该线程必须处理信息,信息广播到所有的系统窗口中,如果你有一个没有设置等待间隔的等待函数系统将会死锁!

 


下列是一些同步方法:

 

以上是关于MSDN 同步部分 个人笔记的主要内容,如果未能解决你的问题,请参考以下文章

个人笔记--多线程(锁)

个人笔记--多线程(安全和通信)

JQuery部分个人笔记

Promise个人笔记(如有错误欢迎指正)

软件测试 期末 个人复习笔记(部分)

计算机算法 期末复习个人笔记(部分)