文档章节

线程同步的方法

我爱睡觉
 我爱睡觉
发布于 2017/06/24 17:37
字数 807
阅读 10
收藏 0

Win32一个最容易的同步机制是critical sections,用来处理一份共享之资源。Critical Sections并不是核心对象,存在于进程的内存空间中。

InitializeCriticalSection(),EnterCriticalSection(),LeaveCriticalSection(),DeleteCriticalSection(),你应该在每一个存取 全局数据的地方使用

Enter/Leave函数。一旦一个线程 进入一个Critical Section,它就能够一再地重复 进入该Critical Section,唯一的警告就是,每一个“进入”操作

都必须有一个对应的“离开”操作。最牢靠而最立即的警告:千万不要在一个Critical Section之中调用Sleep()或任何Wait...()API函数。Critical

Section的一个缺点就是,没有办法获知进入Critical Section中的那个线程是生是死,如果进入Critical Section的那个线程结束了或当掉了,而没有调用LeaveCriticalSection()的话,就会产生Dangling Critical Sections .任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁阴影。对大部分而言,最好的政策就是找出一种方法以确保死锁 不会发生,强迫资源锁定,使它们成为“all or nothing”.由于Dangling

Critical Section 和 死锁问题,引入了 Mutex.

 

mutex是Mutual Exclusion的缩写,虽然mutex和critical Section做相同的事情,但是它们的运作有差别的:1.mutex锁住时间是锁住critical

section的100倍。2.Mutex可以跨进程使用。3.mutex可以指定“结束等待”的时间长度. CreateMutex(), OpenMutex(),

WaitForSingleObject(),WaitForMultipleObjects(),MsgWaitForMultipleObjects(), ReleaseMutex(),CloseHandle().一旦没有任何线程拥有

mutex,这个mutex便处于激发状态,线程拥有mutex时,它便处于不激活状态。mutex有一个非常重要的特性,这性质在各种同步机制中是

独一无二的,如果线程拥有一个mutex而在结束前没有调用RealseMutex(),mutex不会被摧毁,取而代之的是,该mutex会被视为"未被拥有"以及"未被激发",而下一个等待中的线程会被以WAIT_ABANDONED_0 -WAIT_ABANDONED_0_N+1 通知。

 

Semaphores是解决各种productor/consumer问题的关键要素,这种问题会存在一个缓冲区,可能在同一时间内被读出数据或写入数据。理论可以证明:mutex是semaphore的一种退化。如果你产生一个semaphore并令最大值为1,那就是一个mutex。也因此,mutex又常被称为binary semaphore.但semaphores不象mutexes,它并没有所谓的"wait abandoned"状态可以被其他线程侦测到。Semaphore的现值意义是目前可用的资源数。CreateSemaphore(), WaitForSingleObject(),WaitForMultipleObjects(),MsgWaitForMultipleObjects(),

ReleaseSemaphore(),与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就的是调用Wait...()的那个线程。任何线程都可以在任何时间调用ReleaseSemaphore(),接除被任何线程锁定的Semaphore.

 

Win32中最具弹性的同步机制就属Events对象了。CreateEvent(),SetEvent(),ResetEvent(),PulseEvent().

 

同步机制的最简单类型是使用Interlocked函数。这些函数没有提供“等待”机能,它们只是保证对某个特定变量的存取操作是“一个一个接顺序来”。InterlockedIncrement(),InterlockedDecrement(),这两个函数都只能够和0做比较,不能和任何其他数值比较。InterlockedExchange(),

 

本文转载自:http://blog.csdn.net/zhangmiaoping23/article/details/5902439

我爱睡觉
粉丝 3
博文 2120
码字总数 0
作品 0
南昌
私信 提问
JAVA多线程入门

JAVA多线程概述 为什么使用多线程 进程之间不能共享内存,但线程之间共享内存很容易 系统创建进程需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多...

胡壮壮
2017/05/02
0
0
12、Java并发性和多线程-Java同步块

以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容: Java同步关键字(s...

easonjim
2017/06/15
0
0
java线程状态转换/同步与锁

Java线程的转换: 线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。 1、 新状态:线程对象已经创建,还没有调用start()方法 2、 可运行状态:当线程有资格运行,但调度...

晨曦之光
2012/05/16
280
0
多线程知识梳理(11) - 队列同步器实现原理 & 应用

一、基本概念 队列同步器在并发包中的实现是,简称为,它是用来构建锁或者其它同步组件的基础框架。了解其实现原理有助于: 理解同步组件和的原理 理解实现等待通知/模式的原理 根据业务场景...

泽毛
05/09
0
0
JAVA多线程06-基础篇-synchronized

本节摘要:介绍synchronized 的作用,原理,用法 一、为什么需要synchronized? 因为在并发的场景下,是需要保证线程安全的,产生线程安全问题的原因主要有两个:一是临界资源,二是多线程访...

x_coder
2017/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部