(在知乎看到轮子哥说,掌握了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. AJPFX:关于面向对象及java的一些机制的思考

    1.变量的作用域和生命周期什么关系? 2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢? 3.java源文件中代码的组织方式一 ...

  2. GIT配置及用法

    ssh配置 TortoiseGit配置 用法: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓 ...

  3. php5.6.30开启redis扩展

    注:5.6版本的php一定要下载phpredis3.0以上的版本,之前自己下载用的2.2.4的redis,安装配置完成后,PHP死活不支持redis的扩展,通过phpinfo打印也压根看不到,重复服务 ...

  4. zabbix3.0.4 部署之八 (zabbix3.0.4 报警前端配置)

    (如何让报警信息推送----微信.邮件)(邮件与微信一样就不在重复) 创建一个用户 将用户加入administrator组 添加之前设置的报警媒介脚本 设置报警等级 创建动作 配置报警内容 设置报警条 ...

  5. 《哈佛商业评论》2017年第5期:4星。成功CEO具有4种行为特质:果断、激励参与、主动适应、稳扎稳打。股东价值最大化的理念有重大缺陷。

    老牌管理学杂志,每期都值得精度.本期几个比较重要的观点:谦逊的CEO能带来更好的业绩:飞利浦创新过度导致业绩下滑:股东最大化的理念有重大缺陷,后果之一是大宗股票的临时持有者可能干预公司事务,强迫公司采 ...

  6. cpio - 存取归档包中的文件

    总览 (SYNOPSIS) cpio {-o|--create} [-0acvABLV] [-C bytes] [-H format] [-M message] [-O [[user@]host:]a ...

  7. QTreeWidgetItem和QTreeWidgetItemIterator

    1.{ ui->treeWidget->setHeaderHidden(true); ui->treeWidget->clear(); QTreeWidgetItem *ima ...

  8. SpringMVC+ajax返回JSON串

    一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...

  9. CSU1019: Simple Line Editor

    1019: Simple Line Editor Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Subm ...

  10. YUM:Yellow dog Updater Modified

    1. 什么是YUM YUM(全称为 Yellow dog Updater Modified) 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从 ...