线程同步

来源:互联网 发布:mysql控制台闪退 编辑:程序博客网 时间:2024/05/18 02:22

1.       线程的同步可以分为两种:用户方式中的线程同步和内核对象实现线程同步

2.       比较

用户方式中的线程

内核对象实现线程同步

特性

运行速度

是否跨进程

3.       几个概念的介绍

1》 原子访问:是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。

2》 原子操作方式,是指该代码知道没有别的线程要访问该资源。

3》 成功等待的副作用,是指对于有些内核对象,成功地调用WaitForSingleObjectWaitForMultipleObject, 会改变对象状态。

 

4.       介绍

1》 互锁:用户方式,原子访问, 只能在单值(锁住一个公用的值)上运行,无法使线程进入等待。

2》 关键代码:用户方式,原子操作方式, 可以使线程进入等待,容易陷入死锁, 因为在等待进入关键代码段时无法设定超时值。

3》 事件,一种是人工重置的事件,当得到通知,等待该事件的所有线程均变为可调度线程。 另种是自动重置事件,当得到通知,等待该事件的线程中只有一个线程变为可调度线程(设置了成功等待的副作用, 即当线程成功地等待到该对象时,自动重置的事件就会自动重置到未通知状态。)。

4》 信标,用于对于资源(线程个数)进行计数。使用规则:当前资源的数量大于0,则发出信标信号;当前资源的数量是0,则不发出信标信号; 系统决不允许当前资源的数量为负值;当前资源数量决不能大于最大资源数量。(注意:信标对象的使用数量与它的当前资源数量是两个概念。)

5》 互斥:对于互斥对象来说,正常的内核对象的已通知和未通知规则存在一个特殊的异常情况。如果试图获取互斥对象的线程的ID和与互斥对象中记录的线程ID相同,即使互斥对象处于未通知状态,系统也允许该线程保持可调度状态(递归计数器的值大于1)。