(在知乎看到轮子哥说,掌握了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 同步部分 个人笔记的更多相关文章

  1. rsync同步工具学习笔记

    rsync同步工具 1.rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.rsync软件适用于unix/linux/windows等多种操作 ...

  2. synchronized(){}同步代码块笔记(新手笔记,欢迎纠正)

    /* 内容:同步代码块,目的是解决多线程中的安全问题.什么安全问题呢??就是在执行run方法时,假如线程-0刚刚获得执行权, *还没执行时,就挂那了,这时线程-1获得执行权,并进行执行,就有可能出现负 ...

  3. Java 线程第三版 第五章 极简同步技巧 读书笔记

    一.能避免同步吗? 取得锁会由于下面原因导致成本非常高:     取得由竞争的锁须要在虚拟机的层面上执行很多其它的程序代码.     要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 ...

  4. 《Java并发编程实战》第五章 同步容器类 读书笔记

    一.同步容器类 1. 同步容器类的问题 线程容器类都是线程安全的.可是当在其上进行符合操作则须要而外加锁保护其安全性. 常见符合操作包括: . 迭代 . 跳转(依据指定顺序找到当前元素的下一个元素) ...

  5. 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记

    一.锁的劣势 锁定后假设未释放.再次请求锁时会造成堵塞.多线程调度通常遇到堵塞会进行上下文切换,造成很多其它的开销. 在挂起与恢复线程等过程中存在着非常大的开销,而且通常存在着较长时间的中断. 锁可能 ...

  6. 《Java并发编程实战》第十四章 构建自己定义的同步工具 读书笔记

    一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...

  7. pull同步远程仓 笔记

    一.远程仓库删除文件 远程仓 1.py 本地仓 1.py  2.py pull后 本地仓 1.py 这里的2.py 是没有改动过的情况,如改动了要解决冲突的,见:https://www.cnblogs ...

  8. 同步FIFO学习笔记

  9. 分享一下我研究SQLSERVER以来收集的笔记

    分享一下我研究SQLSERVER以来收集的笔记 前言 为什麽分享??因为像现在网上很多人攻城师那样,转行去卖水果,卖早餐,总有一日我也会离开这个行业的 由于本人不是在大公司上班工资很低,我希望有一天存 ...

随机推荐

  1. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...

  2. HTML中的那些bug

    1.语法检测时提示有多余的结束标签 <!doctype html> <html> <head> <meta charset="utf-8" ...

  3. web.xml 加载顺序

    参考网址: 上下文对象>监听>过滤器>servlet 1.先加载上下文对象 <!-- 初始化Spring classpath*:spring/applicationContex ...

  4. Boost库编译安装

    一.Boost库介绍         Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其 ...

  5. Node.js——Stream

    介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerRespo ...

  6. spring 获取ApplicationContext

    第一种:获取根目录下的文件名 ApplicationContext ac = new ClassPathXmlApplicationContext("../mvc-dispatcher-se ...

  7. asterisk-java ami3 属性改变监听

    asteriskServer.addAsteriskServerListener(new AsteriskListenerInit());//服务属性监听会自动连接服务 实现AsteriskServe ...

  8. 整合Activiti Modeler到业务系统(或BPM平台)

    http://www.kafeitu.me/activiti/2013/03/10/integrate-activiti-modeler.html 1. 为什么要整合 Activiti 5.10版本把 ...

  9. Locations for Public Frameworks

    Locations for Public Frameworks Third-party frameworks can go in a number of different file-system l ...

  10. win10下anaconda3环境配置

    WINDOW系统设置环境变量:我的电脑右键-属性-高级系统设置-高级-环境变量中在path中加入你系统安装anaconda的目录下的scripts中: C:\Users\***\anaconda3\S ...