本文参考了http://blog.csdn.net/morewindows/article/details/7538247
1.线程(进程)同步的主要任务
答:在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在急用临界资源时,如多个线程急用同一台打印机,会使打印结果交织在一起,难于区分。当多个线程急用共享变量,表格,链表时,可能会导致数据处理出错,因此线程同步的主要任务是使并发执行的各线程之间能够有效的共享资源和相互合作,从而使程序的执行具有可再现性。
2.线程(进程)之间的制约关系?
当线程并发执行时,由于资源共享和线程协作,使用线程之间会存在以下两种制约关系。
(1)间接相互制约。一个系统中的多个线程必然要共享某种系统资源,如共享CPU,共享I/O设备,所谓间接相互制约即源于这种资源共享,打印机就是最好的例子,线程A在使用打印机时,其它线程都要等待。
(2)直接相互制约。这种制约主要是因为线程之间的合作,如有线程A将计算结果提供给线程B作进一步处理,那么线程B在线程A将数据送达之前都将处于阻塞状态。
间接相互制约可以称为互斥,直接相互制约可以称为同步,对于互斥可以这样理解,线程A和线程B互斥访问某个资源则它们之间就会产个顺序问题——要么线程A等待线程B操作完毕,要么线程B等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步。
关键段、事件、互斥量、信号量的区分解释:
关键段CS与互斥量Mutex
|
创建或初始化 |
销毁 |
进入互斥区域 |
离开互斥区域 |
关键段CS |
Initialize- CriticalSection |
Delete- CriticalSection |
Enter- CriticalSection |
Leave- CriticalSection |
互斥量Mutex |
CreateMutex |
CloseHandle |
等待系列函数如WaitForSingleObject |
ReleaseMutex |
关键段与互斥量都有“线程所有权”概念,可以将“线程所有权”理解成旅馆的房卡,在旅馆前台登记名字拥有房卡后是可以多次进出房间的,其它人则无法进入直到你交出房卡。每个线程必须先通过EnterCriticalSection或WaitForSingleObject来尝试获得“线程所有权”才能调用LeaveCriticalSection或ReleaseMutex。否则会调用失败,这就相当于伪造房卡去办理退房手续——由于登记本上没有你的名字所以会被拒绝。
互斥量能很好的处理“遗弃”情况,因此在多进程之间可以放心的使用。
事件Event
|
创建 |
销毁 |
使事件触发 |
使事件未触发 |
事件Event |
CreateEvent |
CloseHandle |
SetEvent |
ResetEvent |
注意事件的手动置位和自动置位要分清楚,不要混淆了。
信号量Semaphore
|
创建 |
销毁 |
递减计数 |
递增计数 |
信号量 Semaphore |
Create- Semaphore |
CloseHandle |
等待系列函数如WaitForSingleObject |
Release- Semaphore |
信号量在计数大于0时表示触发状态,调用WaitForSingleObject不会阻塞,等于0表示未触发状态,调用WaitForSingleObject会阻塞直到有其它线程递增了计数。
相关推荐
d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...
vc++ 多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区
Delphi线程同步(临界区、互斥、信号量).pdf
小实验三:根据同步机制的Peterson软件解决方案尝试自己编程实现线程同步机制和用于上述线程并发问题的解决,并基于程序运行时间长短将其与基于Windows互斥信号量的线程同步机制的效率展开比较。 实验要求:线程主体...
自己编写的 线程同步控制 有事件 互斥 临界区 信号量欢迎大家给与指正和修改 如果您编译的时候 不能通过 是因为您安装的vs2008没有打SP1的补丁,所以打上补丁就可以了 或者您感觉补丁打起来有些麻烦 也可以...
采用QT5开发的多线程同步,包括信号量,互斥量,等待条件等,里面包含多个生产者,一个消费者。如需多个消费者,可直接复制粘贴进行模拟。
用C++实现多线程间的同步和互斥,模拟读者、写者问题,支持一个读者一个写者、多个读者一个写者以及多个读者多个写者间的同步和互斥。
线程同步的四种方法的代码。事件 互斥量 信号量 临界区
利用多线程原理模拟生产与消费的互斥同步过程,使用了信号量
互斥锁、条件变量、信号量是系统为实现多线程(多进程)访问共享资源或共同协作的同步机制
VisualC++线程同步技术剖析临界区,时间,信号量,互斥量[定义].pdf
进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法得知那个线程会先运行,哪个线程会后运行。下面介绍一些技术,通过他们,你会合理安排你的线程之间对资源的...
thread:未使用windows互斥信号量程序 thread2:使用windows互斥信号量程序 thread3:使用同步机制的peterson软件解决方案
java同步互斥信号量问题 多线程的创建同步互斥函数P(),V()
VC++MFC多线程同步实例,信号量,互斥锁,事件,临界资源
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
介绍了linux线程同步的所有方式,包括互斥、自旋、信号量、条件变量等技术
1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法比较简单,当你在第一个线程运行时想等待第二个...