`

经典线程同步总结 关键段 事件 互斥量 信号量

 
阅读更多

本文参考了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

 

 

 

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

互斥量能很好的处理“遗弃”情况,因此在多进程之间可以放心的使用。

 

事件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++ multithread多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区

    本教程将深入探讨四种常见的线程同步机制:事件对象、信号量、互斥量以及临界区,帮助开发者理解和掌握如何在VC++中安全地实现多线程通信。 一、事件对象 事件对象是Windows API中用于线程间通信的一种同步机制。它...

    Delphi线程同步(临界区、互斥、信号量).pdf

    在Delphi中,临界区、互斥量和信号量是三种常用的线程同步手段。临界区适用于同一进程内的线程同步,互斥量支持跨进程同步,而信号量则更适用于控制多个线程对资源的访问次数。根据具体的应用场景选择合适的同步机制...

    线程同步机制代码,用c++写的,:使用Windows互斥信号量操作函数和同步机制的Peterson,实现进程互斥和同步

    小实验三:根据同步机制的Peterson软件解决方案尝试自己编程实现线程同步机制和用于上述线程并发问题的解决,并基于程序运行时间长短将其与基于Windows互斥信号量的线程同步机制的效率展开比较。 实验要求:线程主体...

    c++多线程同步——信号量

    在C++编程中,多线程同步是一种关键的技术,它允许多个执行线程协同工作,以避免数据竞争和死锁等并发问题。信号量(Semaphore)是实现多线程同步的一种有效工具,常用于控制对共享资源的访问。在这个名为"Mthread11...

    Windows临界区,内核事件,互斥量,信号量

    Windows提供了多种线程同步的机制,包括临界区(Critical Sections)、内核事件(Kernel Events)、互斥量(Mutexes)和信号量(Semaphores)。下面将详细介绍这四种同步方式,以及它们在实现线程互斥管理中的不同...

    线程同步(信号量,互斥,条件变量)

    线程同步是解决这一问题的关键技术,主要包括互斥量、信号量和条件变量。 **互斥量(Mutex)**是一种基本的线程同步机制,用于保护共享资源免受并发访问的影响。在上述例子中,如果多个线程同时访问并修改全局链表...

    使用信号量和关键段实现多线程的同步与互斥

    通过以上知识点,我们可以理解如何使用C++中的信号量和关键段来解决读者、写者问题,实现不同数量的读者和写者之间的同步与互斥。项目中的`ReaderWriter`文件可能包含了具体的代码实现,包括线程创建、信号量初始化...

    VisualC++线程同步技术剖析临界区,时间,信号量,互斥量[定义].pdf

    Visual C++ 线程同步技术剖析:临界区、事件、信号量、互斥量 多线程同步技术是计算机软件开发的重要技术, Visual C++ 提供了多种线程同步技术来确保线程之间的安全交互。本文对 Visual C++ 中的多线程同步技术...

    操作系统线程同步算法

    在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等。本主题将深入探讨未使用和使用Windows互斥量的线程同步方案,以及Peterson算法这一经典的软件解决方案。 首先,未使用Windows...

    自己编写的 线程同步控制 有事件 互斥 临界区 信号量欢迎大家给与指正和修改 线程同步控制

    自己编写的 线程同步控制 有事件 互斥 临界区 信号量欢迎大家给与指正和修改 如果您编译的时候 不能通过 是因为您安装的vs2008没有打SP1的补丁,所以打上补丁就可以了 或者您感觉补丁打起来有些麻烦 也可以...

    qt5多线程,信号量,互斥量,等待条件

    本文将详细探讨如何利用QT5的线程机制,以及信号量(Semaphore)、互斥量(Mutex)和等待条件(Condition Variable)等同步原语,来构建一个高效的生产者-消费者模型。 首先,我们要理解线程的基本概念。线程是程序...

    线程同步的四种详细使用方法--临界区、互斥量、事件等

    线程同步的四种详细使用方法--临界区、互斥量、事件等 线程同步是计算机软件开发的...临界区、互斥量、事件、信号量等四种方法都是常用的线程同步方法,每种方法都有其特点和缺陷,需要根据实际情况选择适当的方法。

    解决多线程编程中的同步互斥问题

    在Windows平台下,解决多线程同步互斥问题的一种常用方法是使用关键段(Critical Section)。关键段是一种轻量级的同步对象,用于保护共享资源免受并发访问的影响。一旦一个线程获得了对某个关键段的所有权,其他...

    《临界区,互斥,信号量》

    互斥量提供了比临界区更强大的功能,不仅支持同一进程内的线程同步,还支持跨进程的线程同步。通过互斥量,可以确保一次只有一个线程访问共享资源。 **创建与释放互斥量:** - `CreateMutex()`:用于创建一个新的...

    windows多线程的同步和互斥

    通过合理利用临界区、事件、互斥量、信号量等工具,开发者可以有效地控制线程的执行顺序和资源访问,避免数据竞争和死锁,从而编写出高效、可靠的多线程程序。在实际开发中,理解并熟练运用这些概念和方法,对于优化...

    线程同步的四种方式

    信号量分为二进制信号量(类似于互斥量,计数值只能为0或1)和计数信号量(计数值可大于1)。在C++17中,可以使用`std::counting_semaphore`和`std::binary_semaphore`来实现信号量。 4. **临界区(Critical ...

    利用互斥实现多线程同步

    互斥量是实现多线程同步的有效工具,能确保共享资源在同一时间仅被一个线程访问。在实际开发中,正确地使用互斥量可以预防数据竞争,保证程序的正确性和性能。然而,过度使用或设计不当的互斥量可能导致不必要的阻塞...

    多线程、许可证、互斥量、信号量 API的使用

    许可证、互斥量和信号量则是多线程编程中控制资源访问和同步的关键工具。这些概念在并发编程中占据着核心地位,尤其在分布式系统、网络编程以及大型应用程序开发中不可或缺。 **多线程** 多线程是指一个进程中可以...

    Visual C++信号量线程同步的简单实例工程

    常见的线程同步机制包括互斥量(Mutex)、事件(Event)、临界区(Critical Section)以及我们关注的信号量。在本实例工程中,信号量被用作一种控制线程并发访问共享资源的机制。 在CSemaphoreSyn项目中,我们可能...

Global site tag (gtag.js) - Google Analytics