`

线程间的同步与互斥

    博客分类:
  • Java
阅读更多

线程间的同步(实指线程间的通信):一般来说,一个线程相对于另一个线程的运行速度是不确定的,也就是说线程是在异步环境下运行的,每个线程都会以不可预知的速度向前推进。但是相互合作的线程需要在某些确定点上协调工作,当一个线程到达了这些点后,除非另一进程已经完成了某些操作,否则就不得不停下来等待别的线程来完成这些操作,这就是线程间的同步。

线程间的互斥(实指对同享资源约束访问):在多线程环境中,各线程可以共享各类资源,但有些资源一次只能允许一个线程使用,这种资源称“临界资源”,如打印机、公共变量。

 

临界区:对临界资源实施操作的一段程序。

 

线程间的同步与互斥是通过操作系统的信号量与PV操作原语来实现的。

 

信号量S的物理意义是S>=0表示某资源的可用数,S<0其绝对值表示阻塞队列中等待该资源的进程数。

 

P操作定义:S:=S-1,若S>=0,则执行P操作的线程继续操作;否则若S<0,则置该线程为阻塞状态(因为无可用资源),并将其插入到阻塞队列中。

P操作(相当于wait())可用如下过程表示:

Procedure P(Var S:Semaphore);

Begin

       S:=S-1;//先申请资源,再判断

       If S<0 then W(S)//如果没有可用资源,则该线程阻塞

End;

 

V操作定义:S:=S+1,若S>0,则执行V操作的线程继续执行;否则S=<0,则从阻塞状态唤醒一个线程,并将其插入到就绪队列,然后执行V操作的线程继续。

V操作(相当于notify())可用如下过程表示:

Procedure V(Var S:Semaphore);

Begin

       S:=S+1;//释放资源后,再判断

       If S<0 then W(S)//释放资源,如果S<0则表明阻塞队列有阻塞线程,则唤醒

End;

 

PV操作实现进程的同步与互斥:

单缓冲消费者与生产者问题

初始化信号量:S1=1,表示缓冲可以使用空间数,S2=0,表示缓冲已使用的个数。

P1(生产线程):生产一个产品              P2(消费线程):P(S2)

                             P(S1)                                                         从缓冲区取一个产品

                             产品送缓冲区                                            V(S1)

                             V(S2)                                                         消费

 

多缓冲消费者与生产者问题

初始化信号量:S1=3(假如有三个缓冲),表示缓冲可以使用空间数,S2=0,表示缓冲已使用的个数。因为是多缓冲,所以还需要第三个信号量S=1用来对多缓冲进行互斥访问,单缓冲不需要这个信息量,因为如果是单缓冲,则生产线程与消费线程只能交替着来执行,而多缓冲的情况下,则生产与消费者线程同时执行,但缓冲是一个临界资源,需互斥访问,即同只允许一个线程使用它,好比多个线程使用一个 HashMap 一样。

P1(生产线程):生产一个产品              P2(消费线程):P(S2)

                             P(S1)                                                        P(S)

                             P(S)                                                          从缓冲区取一个产品

  产品送缓冲区                                           V(S)

                             V(S)                                                          V(S1)

   V(S2)                                                        消费

分享到:
评论

相关推荐

    JAVA实现线程间同步与互斥生产者消费者问题

    在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...

    操作形同实验——进程同步和互斥

    (1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2) 了解Windows2000/XP中多线程的...

    操作系统实验 多线程同步与互斥 java编写 有界面

    在“操作系统实验 多线程同步与互斥 java编写 有界面”的实验中,可能需要设计一个图形用户界面(GUI),通过按钮或事件触发线程的创建和同步操作,直观地展示线程间的交互和同步效果。例如,可以模拟银行账户转账,...

    编程实现进程(线程)同步和互斥

    在Windows等操作系统下,使用的VC、VB、java或C等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者-消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。

    linux上实现多进程和多线程实现同步互斥(源代码)

    线程间的同步互斥通常通过以下方法实现: 1. 互斥锁(Mutex):使用`pthread_mutex_init()`初始化互斥锁,`pthread_mutex_lock()`和`pthread_mutex_unlock()`进行锁定和解锁。当一个线程获得锁后,其他试图获取该锁...

    C# 多线程的同步与互斥(使用Mutex和Event)

    学习多线程同步和互斥不仅对理解操作系统原理至关重要,也是编写高效、稳定的多线程应用程序的基础。Mutex和AutoResetEvent只是C#中众多同步原语的一部分,还包括Semaphore、Monitor、SemaphoreSlim等。理解并熟练...

    线程间实现同步互斥的方法

    以上内容涵盖了线程同步互斥的基本概念和实现方式,包括互斥量、信号量、条件变量、读写锁、原子操作以及线程局部存储等。在阅读“进程同步与互斥.doc”、“线程间实现同步互斥的方法.doc”和“进程间通信.doc”这三...

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

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

    实例讲述线程的同步互斥

    综上所述,线程同步互斥对于构建稳定、高效的多线程程序至关重要。通过合理使用各种同步机制,我们可以确保程序在并发环境下的正确性,避免数据竞争和死锁等问题。在学习和实践中,理解并熟练掌握这些概念和工具,将...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...

    操作系统实验报告_进程同步与互斥.doc

    实验中,设计了一个控制台进程,在该进程中创建 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 实验环境:Windows 2000/XP + Visual C++ 6.0 实验容:以生产者-消费者模型为依据,在 Windows 2000/XP...

    windows多线程的同步和互斥

    线程互斥是线程同步的一个子集,主要关注的是确保在同一时刻只有一个线程访问共享资源。例如,使用互斥量可以实现线程互斥。互斥量的特性是,一旦一个线程获得了互斥量,其他所有尝试获取的线程都将被阻塞,直到拥有...

    Linux下多线程及多进程及同步与互斥编程详细介绍

    Linux下多线程及多进程及同步与互斥编程详细介绍

    线程的同步与互斥解决消费者生产者问题

    假设存在两类进程:生产者,消费者。它们共享n个缓冲区。 生产者行为:生产产品(每次生产1个),并将产品放入空缓冲区,循环 往复,永不停息; 消费者行为:将产品从缓冲区中取出,进行消费(每次消费1个),循环 ...

    线程间实现同步互斥的方法(合集)

    ### 线程间实现同步互斥的方法(合集) #### 概述 在多线程编程中,线程间的同步互斥是非常重要的概念。它主要用于处理多线程环境中资源共享和并发执行的问题,确保程序的一致性和正确性。本文详细介绍了几种常用的...

    实验二进程线程的同步及互斥.doc

    * 实验容以生产者/消费者模型为依据,在 Windows 环境下创立一个控制台进程,在该进程中创立 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 * 实验要求: + 学习并理解生产者/消费者模型及其同步/互斥...

    操作系统中对于线程的同步与互斥问题的设计原理及代码

    操作系统中的线程同步与互斥是并发编程中的关键概念,它们确保了多线程环境下的程序正确性和资源安全。线程互斥是指当多个线程访问同一临界资源时,同一时刻只允许一个线程进行操作,以防止数据竞争和不一致的状态。...

    进程的同步与互斥习题(含部分题目的参考答案).doc

    进程的同步与互斥习题 本文将对进程的同步与互斥习题进行详细的解释和分析,涵盖了多种不同的场景和问题,包括进程的同步、互斥、信号量、缓冲区、生产者消费者问题、读者写者问题、司机与售票员问题、汽车过桥问题...

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

    7. **线程同步(Synchronization)** 为了确保线程安全,必须确保线程按照预期顺序执行。在读者、写者问题中,使用`wait()`和`post()`(或`unlock()`和`lock()`)操作对信号量进行操作,来协调读者和写者的操作。例如...

Global site tag (gtag.js) - Google Analytics