线程同步
说到线程同步,就不得不提一下操作系统。首先,操作系统最小的运行单位是进程。而进程的独立运行单位是线程,也就是说一个进程至少有一个线程。而且,在同一进程里的线程可以共享进程内的资源。
但是为什么需要线程同步呢。说到底,就是共享资源惹的祸。打个比方:桌上有一盒饼干,桌子坐了2个人。假设每个人都不知道别人一次拿了几块饼干,并且不知道别人什么时候拿饼干,而且只有在自己拿饼干的时候才能知道饼干盒里还剩下多少饼干。那么,如果饼干盒里共10块饼干。甲拿了3块饼干,吃了一块之后,把两块饼干放回了盒子(放回饼干时不重新检测饼干盒剩下的饼干)。在甲拿饼干之后,放回饼干之前,乙拿了2块饼干吃掉了。那么,按照假设,甲会认为饼干盒里还有多少饼干?乙认为有多少饼干?实际上有多少饼干?
我们不妨来分析一下。按照时间轴,发生的事件顺序为:
- 甲拿3块饼干。
- 乙拿2块饼干。
- 甲放回2块饼干。
对于甲来说,乙的操作他是看不见的。那么甲在第二次拿饼干之前就会认为:
剩余饼干数 = 总饼干数(10)- 甲拿的饼干数(3)+ 甲放回的饼干数(2)
= 9(块)
对于乙来说,甲的操作他也看不见。同理,乙在第二次拿饼干之前会认为:
剩余饼干数 = 拿饼干之前剩余的饼干数(10-3) - 乙拿的饼干数(2)
= 5(块)
实际上饼干数却是:
10 - 3 - 2 + 2 = 7(块)
看到这里,有些观众朋友就会说,这个比方太扯蛋了。如果说这个比方真的扯蛋,那么我只能说。同理,计算机也很扯蛋。事实上如果不使用特殊手段营造上述比方的条件,根本不会出现上述情况。不是说现实中的人就不需要线程同步了,我认为其实是人在无形中已经完成同步了。
- 1. 人的眼睛可以随时检查饼干盒里的饼干数
- 2. 甲和乙可以互相看到对方的操作
用计算机化点的话说,人眼睛是个监听器,随时随刻都在监听饼干盒里的饼干数。那么大家想想,为什么在计算机中没有用监听机制,而是用了另一中方法(后面会提到)呢。我认为最大的原因是代价太大了,如果使用监听机制,就要求每个线程都必须随时随刻监听共享资源。如果开了10000个线程,就需要10000个监听器。大家可以想象一下10000个监听器的资源消耗是多么的惊人。
那么现代计算机采用的同步机制是怎么回事呢?原理很简单:
- 线程访问共享资源之前给共享资源上一把锁,不允许其他线程访问共享资源
- 在线程结束访问共享资源之后解锁,此时其他线程才有权限访问共享资源
- 如果线程在访问资源时共享资源被上了锁,则阻塞直到共享资源解锁之后,具体是那个线程可以获取访问权限则看系统的调度。
用同步的方法来演示一下上述的比方:
- 饼干盒上锁(形象点就是甲大喊一声这是我的饼干,谁都不许碰)甲拿3块饼干
- 此时乙想去拿2块饼干,但是饼干盒上了锁(甲不许他拿),乙进入等待状态(等甲心情好了在去吃饼干)
- 甲放回2块饼干,饼干盒解锁。(甲吃了一块饼干,觉得吃饱了,放回了2块饼干,对乙说我吃饱了,要吃你就拿过 去吃吧)
- 饼干盒上锁,乙拿2块饼干。(现在饼干归我了,其他人不许吃我的)
- 饼干盒解锁。(乙也吃饱了)
注意:千万记得在使用资源之后解锁,大家可以去试试不解锁会出现什么情况。
我理解的线程同步就是这么回事。
相关推荐
在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...
线程同步是多线程编程中的重要概念,用于协调多个并发执行的线程,确保它们在访问共享资源时不会产生竞态条件或数据不一致性。在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及...
操作系统线程同步是多线程编程中的核心概念,旨在确保并发执行的线程在访问共享资源时不会引发数据不一致性和竞态条件。本实验报告详细探讨了这一主题,通过一个简单的银行账户转账的示例来揭示临界区问题及其解决...
在多线程编程中,线程同步是一种控制多个线程并发执行时访问共享资源的方式,以避免数据不一致和死锁等问题。以下是对线程同步的四种主要方式的详细解释: 1. **事件(Event)** 事件是Windows API提供的一种线程...
在这个“线程同步解决火车站售票问题”的例子中,我们可以通过线程同步机制来实现售票的有序、无冲突的过程。 首先,我们需要理解问题的核心:10个售票处(线程)需要共享1000张票(资源),并且每卖出一张票,必须...
操作系统中的多线程同步是一个关键概念,特别是在并发编程中,它涉及到如何协调多个线程以避免数据不一致性和竞态条件。在这个实验中,我们关注的是C++编程语言中的实现,以及操作系统如何处理线程的优先级。 首先...
本示例“简单实现多线程同步示例(模拟购票系统)”旨在通过一个具体的实例,帮助开发者理解如何在Java中创建并管理多线程以及如何实现线程同步,确保数据的一致性和正确性。 首先,我们要明确多线程的基本概念。在...
在编程领域,线程同步是多线程编程中的一个重要概念,它确保了多个线程在访问共享资源时的正确性和一致性。在这个“VC++线程同步实例”中,我们将探讨如何利用VC++(Visual C++)来实现线程间的同步,以避免数据竞争...
操作系统中的线程同步是多线程编程中一个关键的概念,它确保了多个线程在访问共享资源时的正确性,防止数据竞争和其他并发问题。在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等...
本文将深入探讨Delphi中的多线程和线程同步,并以"SortThreads"和"delphi-thread-gui"这两个示例项目为例,讲解如何在实践中应用这些概念。 1. **多线程**:多线程允许应用程序同时执行多个独立的任务,提高程序的...
然而,多线程环境下也带来了一些问题,尤其是资源竞争和数据一致性问题,这些问题需要通过线程同步机制来解决。本文将详细介绍如何通过临界区、互斥内核对象、事件内核对象和信号量内核对象来实现线程同步。 1. ...
"Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...
在编程领域,线程同步是多线程编程中的一个核心概念,它涉及到如何有效地管理和协调多个并发执行的线程,确保它们能正确地共享资源,避免数据竞争和死锁等问题。这个“线程同步小例子”是基于孙鑫先生著作中的示例...
操作系统实验是计算机科学教育中的重要组成部分,它帮助学生理解和掌握操作系统的基本原理,特别是多线程同步与互斥的概念。在Java编程环境下,这些概念可以通过实际的代码实现来深入理解。 多线程是现代操作系统中...
"多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...
在本例“Jni多线程同步事例”中,我们将探讨如何在JNI层面上实现多线程同步,特别是在一个生产者-消费者模型的场景下。 生产者-消费者模型是一种经典的并发问题,它涉及到两个或多个线程之间的协作。在该模型中,...
C#线程同步是多线程编程中的一个重要概念,它涉及到如何控制多个线程对共享资源的访问,以避免数据不一致性和竞态条件。在C#中,线程同步通常用于确保在某一时刻只有一个线程可以访问特定的代码块或资源,从而保证...