多线程第七篇 经典线程同步与互斥总结

转载 2015年07月09日 11:03:35

前面《多线程二  多线程中的隐蔽问题揭秘》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇

多线程三 经典线程同步之关键段CS

多线程四 经典线程同步之互斥量Mutex

多线程五 经典线程同步之事件Event

多线程六 经典线程同步之信号量Semaphore

       来详细介绍常用的线程同步互斥机制——关键段、事件、互斥量、信号量。下面对它们作个总结,帮助大家梳理各个知识点。

       首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从《计算机操作系统》一书中选取的一些关于线程同步互斥的描述。相信先有个初步而模糊的印象再看下权威的定义,应该会记忆的特别深刻。

1、线程(进程)同步的主要任务

       答:在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在急用临界资源时,如多个线程急用同一台打印机,会使打印结果交织在一起,难于区分。当多个线程急用共享变量,表格,链表时,可能会导致数据处理出错,因此线程同步的主要任务是使并发执行的各线程之间能够有效的共享资源和相互合作,从而使程序的执行具有可再现性。

2、线程(进程)之间的制约关系?

       当线程并发执行时,由于资源共享和线程协作,使用线程之间会存在以下两种制约关系。

     (1)间接相互制约。一个系统中的多个线程必然要共享某种系统资源,如共享CPU,共享I/O设备,所谓间接相互制约即源于这种资源共享,打印机就是最好的例子,线程A在使用打印机时,其它线程都要等待。

     (2)直接相互制约。这种制约主要是因为线程之间的合作,如有线程A将计算结果提供给线程B作进一步处理,那么线程B在线程A将数据送达之前都将处于阻塞状态。

       间接相互制约可以称为互斥,直接相互制约可以称为同步,对于互斥可以这样理解,线程A和线程B互斥访问某个资源则它们之间就会产个顺序问题——要么线程A等待线程B操作完毕,要么线程B等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步

3、临界资源和临界区

       在一段时间内只允许一个线程访问的资源就称为临界资源或独占资源,计算机中大多数物理设备,进程中的共享变量等待都是临界资源,它们要求被互斥的访问。每个进程中访问临界资源的代码称为临界区。

       看完概念性知识,下面用几个表格来帮助大家更好的记忆和运用多线程同步互斥的四个实现方法——关键段、事件、互斥量、信号量。

关键段CS与互斥量Mutex

创建或初始化

销毁

进入互斥区域

离开互斥区域

关键段CS

Initialize-

CriticalSection

Delete-

CriticalSection

Enter-

CriticalSection

Leave-

CriticalSection

互斥量Mutex

CreateMutex

CloseHandle

等待系列函数如WaitForSingleObject

ReleaseMutex

       关键段与互斥量都有“线程所有权”概念,可以将“线程所有权”理解成旅馆的房卡,在旅馆前台登记名字拥有房卡后是可以多次进出房间的,其它人则无法进入直到你交出房卡。每个线程必须先通过EnterCriticalSectionWaitForSingleObject来尝试获得“线程所有权”才能调用LeaveCriticalSectionReleaseMutex。否则会调用失败,这就相当于伪造房卡去办理退房手续——由于登记本上没有你的名字所以会被拒绝。互斥量能很好的处理“遗弃”情况,因此在多进程之间可以放心的使用。

事件Event

创建

销毁

使事件触发

使事件未触发

事件Event

CreateEvent

CloseHandle

SetEvent

ResetEvent

       注意事件的手动置位和自动置位要分清楚,不要混淆了。

信号量Semaphore

创建

销毁

递减计数

递增计数

信号量

Semaphore

Create-

Semaphore

CloseHandle

等待系列函数如WaitForSingleObject

Release-

Semaphore

       信号量在计数大于0时表示触发状态,调用WaitForSingleObject不会阻塞,等于0表示未触发状态,调用WaitForSingleObject会阻塞直到有其它线程递增了计数。

        注意:互斥量,事件,信号量都是内核对象,可以跨进程使用(通过OpenMutexOpenEventOpenSemaphore)。

 

文章转载于:http://blog.csdn.net/morewindows/article/details/7538247

秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: 《秒杀多线程第四篇一个经典的多线程同步问题》 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》   前面介绍了关键...
  • lien0906
  • lien0906
  • 2015年04月15日 16:08
  • 1570

【Linux多线程】同步与互斥的区别

很多人把同步与互斥这两个概念混淆,这里说一下它们的区别。一、同步与互斥的区别1. 同步同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行。例如,线程...
  • lisong694767315
  • lisong694767315
  • 2015年04月29日 23:11
  • 6454

linux多线程编程——同步与互斥

我们在前面文章中已经分析了多线程VS多进程,也分析了线程的使用,现在我们来讲解一下linux多线程编程之同步与互斥。 现在,我们不管究竟是多线程好还是多进程好,先讲解一下,为什么要使用多线程? 一、 ...
  • zqixiao_09
  • zqixiao_09
  • 2015年12月15日 17:18
  • 1660

Linux多线程编程(三)---线程之间的同步与互斥进阶实验

实验目的     通过编写经典的“生产者-消费者”问题的实验,进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。 实验内容    “生产者--消费者”问题描述如下:   ...
  • mybelief321
  • mybelief321
  • 2013年07月21日 09:03
  • 3645

JAVA多线程机制之同步与互斥

一个多线程的程序,两个或者多个线程可能需要访问同一个数据资源。这时就必须考虑数据安全的问题,需要线程互斥或者同步。线程的互斥当多个线程需要访问同一资源时,要求在一个时间段内只能允许一个线程来操作共享资...
  • jianggujin
  • jianggujin
  • 2016年01月04日 20:12
  • 3449

多线程并发编程(四):多线程同步互斥Wait/Notify

前言 前面说了使用Synchronized来进行线程之间的同步,接下来说明wait/notify的使用。 首先wait/notify必须结合synchronized来使用,即在synch...
  • saytime
  • saytime
  • 2016年04月19日 17:16
  • 899

Qt多线程基础(一)线程同步之互斥锁同步

一、直接使用QMutex进行同步 创建线程方法:继承自QThread,重写void run()函数,调用成员start()启动线程,start()中可加入优先级参数。 互斥锁同步方法:void run...
  • hechao3225
  • hechao3225
  • 2016年11月04日 13:45
  • 6346

Python 线程同步与互斥

什么是并发?在操作系统中,指一个时间段内有几个程序都处于已启动到运行结束之间的状态,并且这几个程序都是在同一个处理机上运行的,但任一个时间点却只有一个程序在处理机上执行。 注意并发与并行并不是同一个...
  • SeeTheWorld518
  • SeeTheWorld518
  • 2015年11月04日 18:38
  • 1886

线程同步与互斥:互斥锁

为什么需要互斥锁? 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印...
  • lianghe_work
  • lianghe_work
  • 2015年08月18日 09:59
  • 9048

【Java】线程并发、互斥与同步

网络上对于线程的解析总是天花龙凤的,给你灌输一大堆概念,考研、本科的操作系统必修课尤甚,让你就算仔细看完一大堆文章都不知道干什么。 下面不取网站复制粘贴,在讲解自己的Java线程并发、互斥与同步之前先...
  • yongh701
  • yongh701
  • 2015年01月17日 09:22
  • 2502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程第七篇 经典线程同步与互斥总结
举报原因:
原因补充:

(最多只允许输入30个字)