禁止系统调度上一节《 多线程导致的临界区问题》中由于 test1 线程被 test2 线程打断,才导致了我们没有得到预期的结果,我们一般可通过关闭中断和调度器上锁这两种简单的途径来禁止系统调度,防止线程被打断,从而保证临界区不被破坏。 1、 关闭中断线程中关闭中断保护临界区的结构如下: 把调度器锁住 ...
分类:
编程语言 时间:
2016-05-17 17:47:15
阅读次数:
368
结果分析:在 test1 线程的 for 循环中我们对 i 做了 10000 次累加,如果没有其他线程的“干预”,那么全局变量 g_tmp 的值应该是 10000,现在的输出结果是 10001,这意味全局变量 g_tmp 的值被线程 2 修改过。整个程序运行过程中各个线程的状态变化是这样的: rt_ ...
分类:
编程语言 时间:
2016-05-17 13:29:06
阅读次数:
319
1.什么是信号量? 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在 ...
分类:
系统相关 时间:
2016-05-16 21:32:43
阅读次数:
291
重要概念 同步等待方法返回 异步瞬间返回,继续下一次调用 并发与并行外界表现一致 单核心cpu无法并行,但可以处理并行事务 公共资源或者共享数据 多线程访问时,可能造成临界区数据破坏 非阻塞允许多个线程同时进入临界区 死锁 不能停止服务,静态问题。循环依赖 活锁 动态锁,运行时资源征用 饥饿 缺乏某 ...
分类:
编程语言 时间:
2016-05-15 18:08:50
阅读次数:
238
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的 ...
分类:
其他好文 时间:
2016-05-13 12:16:42
阅读次数:
241
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅。...
分类:
编程语言 时间:
2016-05-12 17:48:41
阅读次数:
157
一、并发与竞争 并发是指多个 多个执行单元同时执行,而这对对共享的资源,比如硬件的资源、软件的全局变量、静态变量 的访问,很容易导致竞态, 1.1、中断屏蔽 在单核的 CPU 里,避免竞态的一个简单有效的方法是,在进入临界区之前,就屏蔽系统的中断。也就是说,在进入临界区之前,中断被关闭,使得中断与进... ...
分类:
系统相关 时间:
2016-05-11 19:35:39
阅读次数:
199
如果一个多线程程序中每个线程处理的资源没有交集,没有依赖关系那么这是一个完美的处理状态。你不用去考虑临界区域(critical section),不用担心存在所谓的条件竞争(race condition),当然也不用去单行执行顺序,当然这种状态只是完美情况下,事实往往没有这么完美。 当多个线程进入临 ...
分类:
编程语言 时间:
2016-05-07 12:47:30
阅读次数:
165
线程安全与锁的优化 互斥锁: 从 实现原理上来讲,Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持 ...
分类:
其他好文 时间:
2016-05-03 14:12:49
阅读次数:
186
一、单例模式 目的:创建唯一实例 二、多线程时的单例 lock确保当一个县城位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待,直到对象被释放。 三、双重锁定 对于instance存在的情况,就直接返回。当instance为null并且同时又两个线程调用Get ...
分类:
其他好文 时间:
2016-05-01 12:19:37
阅读次数:
152