首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

可重入,可打断,公平,条件变量原理解读

可重入原理 什么是可重入:当线程请求一个由其它线程持有的对象时,该线程会阻塞,而当线程请求由自己持有的对象时,如果该是重入,请求就会成功,否则阻塞。...,并且将计数器置为 1;此时其它线程请求该,则必须等待;而该持有的线程如果再次请求这个,就可以再次拿到这个,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为 0,则释放该。...不可打断模式 在此模式下,即使它被打断,仍会驻留在 AQS 队列中,一直要等到获得后方能得知自己被打断了 // Sync 继承自 AQS static final class NonfairSync...可打断:本线程在等待获得的过程中,别的线程可以中止我的等待; ReentrantLock不可打断模式:即使被打断,仅仅是打断标识设置为true,但是仍然线程会在AQS队列中,获得之后能够继续执行;...tryAcquire(arg)) doAcquireInterruptibly(arg); } // ㈠ 可打断的获取流程

15420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Octopress中嵌入ruby代码如何不被解析

    用Octopress写博客即将快一年了,感觉自己用的还可以,并且借此熟练使用了Markdown,但是前几天写一篇关于如何在Octopress中集成多说评论的文章的时候,遇到了一个代码高亮的问题,就是如何处理代码块的问题...问题描述 默认的作为嵌入的ruby代码会被解释然后转成其真实的值对应的HTML代码形式。...举个例子 Octopress中嵌入ruby代码如何不被解析代表当前页面的标题,默认情况下,如果执行了rake generate && rake preview,这段代码会被解释成了Octopress中嵌入...ruby代码如何不被解析 但是我们想要的是原样输出,类似这样在代码块中。...1 {{ page.title }} 如何做到 如果想避免嵌入的ruby代码块被解析,使用{% raw %}和{% endraw %}来包裹不想被解析的代码块即可。

    45020

    linux 文件

    文件基本概念 Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。...文件是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。...文件包括建议性和强制性: 建议性:要求每个使用上锁文件的进程都要检查是否有存在,并且尊重已有的。在一般情况下,内核和系统都不使用建议性,它们依靠程序员遵守这个规定。...在Linux中,实现文件上锁的函数有lockf()和fcntl() lockf()用于对文件施加建议性 fcntl()不仅可以施加建议性,还可以施加强制。...fcntl()还能对文件的某一记录上锁,也就是记录。 记录又可分为读取和写入,其中读取又称为共享,它能够使多个进程都能在文件的同一部分建立读取

    2.8K30

    Linux文件

    一、文件的分类: 翻阅参考资料,你会发现文件可以进行很多的分类,最常见的主要有读与写,前者也叫共享,后者也叫排斥,值得注意的是,多个读之间是不会相互干扰的,多个进程可以在同一时刻对同一个文件加读...;但是,如果已经有一个进程对该文件加了写,那么其他进程则不能对该文件加读或者写,直到这个进程将写释放,因此可以总结为:对于同一个文件而言,它可以同时拥有多个读者,但是在某一时刻,他只能拥有一个写者...根据内核行为来分,文件可以分成劝告与强制两大类: 1....二、文件锁相关的系统调用: 目前跟文件加锁相关的系统调用主要有两个: flock与fcntl, 二者在应用范围方面也存在着一些差别,早起的flock函数只能处理劝告,在Linux...2.6版本中将其功能扩充至强制,另外 flock函数只能对整个文件加锁,不能加记录,而fcntl函数则不仅完全支持加劝告与强制,还支持记录,另外因为它符合POSIX标准,具有很好的可移植性。

    2.3K40

    linux读写

    读写 与互斥量类似,但读写允许更高的并行性。其特性为:写独占,读共享。 读写状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读) 2. 写模式下加锁状态 (写) 3....不加锁状态 读写特性: 1. 读写是“写模式加锁”时, 解锁前,所有对该加锁的线程都会被阻塞。 2....那么读写会阻塞随后的读模式请求。优先满足写模式。读、写并行阻塞,写优先级高 读写也叫共享-独占。当读写以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。...读写非常适合于对数据结构读的次数远大于写的情况。...函数 以读方式请求读写

    3.3K30

    linux读写_共享内存读写

    读写其实还是一种,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 ps:读写本质上是一种自旋 二、为什么需要读写?...,只是做一些查询,所以在读的时候不用给此段代码加锁,可以共享的访问,只有涉及到写的时候,互斥的访问就好了 三、读写的行为 读写之间是互斥的—–>读的时候写阻塞,写的时候读阻塞,而且读和写在竞争的时候...,故会浪费更多的CPU资源 2.挂起等待 挂起等待是当某线程在执行临界区的代码时,那其他线程只能挂起等待,此时这些线程会被CPU调度走,等到释放(即就是临界区的代码被之前的那个线程已经执行完毕...),而且被CPU调度的线程只有被调度回来才可以执行临界区的代码 挂起等待是在发生获取不到的时候,他会被CPU调度走,去做别的事,但是会时不时的去查看有没有被释放 ps:线程想执行临界区的代码的条件...:效率不高,很可能会使临界区的代码不被任何线程执行,因为可能会是线程被 CPU调度走了但是却没有被调度回来 五、读写是怎么实现?

    6.2K10

    C++并发编程 - 原子操作

    --百度百科 ❞   原子操作可以保证正在进行的动作不被打断,即一旦开始,持续结束。对比互斥其优势在于,原子操作在C/C++的层面,是无操作,其既能解决并发问题又不会导致死锁。...使用场景   在多线程的代码中,同时操作一个普通的变量,经过测试,会存在某些严重的bug。...「解决方法」: 可通过互斥或者原子操作解决。相对于互斥,原子操作的使用更为方便,只需要将操作的变量声明为原子操作即可。...:atomic主要类的模板   针对常用的类型,C++11都有对应的原子类型,不同的原子类型开放的接口有些许差异,如下表: 总结 常规的原子操作与普通变量类型使用起来相差不大,其保证变量在修改时不被打断...更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。

    64330

    Linux文件—文件

    Linux系统中,通常采用“文件”的方式,当某个进程独占资源的时候,该资源被锁定,其他进程无法访问,这样就解决了共享资源的竞争问题。 文件包括建议性(又名“协同”)和强制性两种。...建议性要求每个相关进程访问文件的时候检查是否已经有存在并尊重当前的。一般情况下不建议使用建议性,因为无法保证每个进程都能自动检测是否有Linux内核与系统总体上都坚持不使用建议性。...在Linux内核提供的系统调用中,实现文件上锁的函数有lockf()和fcntl(),其中lockf()用于对文件加建议性,这里不再讲解。fcntl()函数既可以加建议性,也可以加强制性。...同时,fcntl()还能对文件某部分上记录。所谓记录,其实就是字节范围,它能锁定文件内某个特定区域,当然也可锁定整个文件。 记录又分为读和写两种。...写又称为排斥,在任何时刻只能有一个程序对文件的记录加写,它用来保证文件记录被某一进程更新数据的时候不被其他进程干扰,确保文件数据的正确性,同时也避免其他进程“弄脏”数据。

    9.5K20

    Linux线程互斥

    今天我们学习Linux线程互斥的话题。Linux同步和互斥是Linux线程学习的延伸。但这部分挺有难度的,请大家做好准备。那我们就正式开始了。...多个执行流进行安全访问的共享资源,叫做临界资源 我们把多个执行流中,访问临界资源的代码叫做临界区,临界区往往是线程代码很小的一部分。 想让多个线程串行访问共享资源的方式叫做互斥。...pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 对特定代码部分进行上锁,这部分代码只能有一次只能有一个执行流进入,被保护的资源叫做临界资源。...我们依旧使用上面的一份代码,稍稍做一下修改: 所以,当一个执行流申请失败时,这个执行流会阻塞在这里。...一定要保证代码的粒度(要保护的代码的多少i)要非常小。 加锁是程序员的行为,必须做到要加的话所有的线程必须要加锁。

    8810

    Linux内核】内核的那点事

    Linux设备驱动中,我们必须要解决的一个问题是:多个进程对共享资源的并发访问,并发的访问会导致竞态。 1、并发和竞态 并发(Concurrency):指的是多个执行单元同时、并行的被执行。...临界区(Critical Sections):访问共享资源的代码区域成为临界区。临界区需要以某种互斥机制加以保护。 常见的互斥机制包括:中断屏蔽,原子操作,自旋,信号量,互斥体等。...CPU0的进程和CPU1的中断之间 CPU0的中断和CPU1的中断之间 单CPU内,该进程与抢占它的进程之间 在单CPU内,多个进程并发执行,当一个进程执行的时间片耗尽,也有可能被另一个高优先级进程打断...中断(软中断、硬中断、Tasklet、底半部)与进程之间 当一个进程正在执行,一个外部/内部中断(软中断、硬中断、Tasklet等)将其打断,会导致竞态发生。...4、总结 由上文可知,为了解决 并发导致的竞态问题 高性能的编译器编译乱序问题 高性能的CPU带来的执行乱序问题 CPU和ARM处理器提供的内存屏障指令等,这也是内核存在的意义。

    24020

    深入Linux并发同步

    原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。...要解决这个问题就需要使用 原子操作,原子操作是指不能被打断的操作,在单核CPU中,一条指令就是原子操作。比如上面的问题可以把 count++ 语句翻译成指令 inc [count] 即可。...Intel x86 CPU 提供了 lock 前缀来锁住总线,可以让指令保证不被其他CPU中断,如下: lock inc [count] 原子操作 能够保证操作不被其他进程干扰,但有时候一个复杂的操作需要由多条指令来实现...在Linux内核中,比较常用的有:自旋、信号量、读写 等,下面介绍一下自旋和信号量的实现。 自旋 自旋 只能在多核CPU系统中,其核心原理是 原子操作,原理如下图: ?...由于Linux的自旋使用汇编实现,所以比较苦涩难懂,这里使用C语言来模拟一下: void spin_lock(amtoic_t *lock) { again: result = --(*lock

    1.5K31

    一文读懂 | 进程并发与同步

    如下图: concurrency-parallelism 原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。...要解决这个问题就需要使用 原子操作,原子操作是指不能被打断的操作,在单核CPU中,一条指令就是原子操作。比如上面的问题可以把 count++ 语句翻译成指令 inc [count] 即可。...Intel x86 CPU 提供了 lock 前缀来锁住总线,可以让指令保证不被其他CPU中断,如下: lock inc [count] 原子操作 能够保证操作不被其他进程干扰,但有时候一个复杂的操作需要由多条指令来实现...在Linux内核中,比较常用的有:自旋、信号量、读写 等,下面介绍一下自旋和信号量的实现。...由于Linux的自旋使用汇编实现,所以比较苦涩难懂,这里使用C语言来模拟一下: void spin_lock(amtoic_t *lock) { again: result = --(*lock

    33330

    Linux 下的文件

    本文内容为 Linux 系统通用,各个语言实现可能稍有不同,但原理相同。 当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失。...文件分类# 文件分两种, 独占(写) 共享(读)。 当进程想要修改文件的时候,申请独占(写),当进程想要读取文件数据的时候,申请共享(读)。...独占和独占、独占和共享都是互斥的。...但是共享和共享是可以共存的,这代表的是两个进程都只是要去读取数据,并不互相冲突。 文件:flock 和 lockf# Linux上的文件类型主要有两种:flock和lockf。...,即粒度更细的记录 flock的是劝告,lockf或fcntl可以实现强制

    42260

    Linux环境编程必须搞懂的几个概念

    Linux环境编程对于初学者来说,必须深刻理解重点概念才能更好地编写代码,实现业务功能,下面就几个重要的及常用的知识点进行说明。搞懂这几个概念后以免在将来的编码出现混淆。...原子操作就是要么不执行,一旦执行就会执行完成,是不可被打断的一个,或一系列的动作,即在完成任务前不会被其他事件所打断,就像原子不可被分割成颗粒一样。...❞ 原子操作其实本质上和实现同样的功能,都是为了保护共享对象,它具有原子性,和顺序性。原子性确保指令执行期间不被打断,要么全部执行,要么根本不执行。...为了实现线程安全,Linux系统提供一些列的方法,或者只能使用局部变量或资源,或者就是利用等同步机制,来实现全局变量或资源的访问。...我们利用就可以解决此问题。 阻塞与非阻塞 ❝Linux环境编程中的阻塞与非阻塞,都是指I/O操作。而所有的I/O系统调用默认都是阻塞的。那什么是阻塞?

    65250

    Linux内核中的各种:信号量互斥读写原子自旋内存屏障等

    使用实例如下: #include // 定义自旋 spinlock_t my_lock; void my_function(void) { spin_lock...开始就支持内核抢占,之前的内核不支持抢占,只要进程在占用CPU且时间片没用完,除非有中断,否则它就能一直占用CPU; 抢占的情况: 比如某个优先级高的任务(进程),因为需要等待资源,就主动让出CPU(又或者因为中断被打断了...因为代码往往不是看我们写的这种顺序被执行的,它有两个层面的乱序: 1)编译器层面的。因为编译器的优化往往会对代码的汇编指令进行重排。 2)CPU层面的。多 CPU 间存在内存乱序访问的情况。...可以用g++ -O2 -S test.cpp生成汇编代码,查看开了-O2优化后的汇编。...所以上述代码中也用到了acquire和release语义分别对读和写设置屏障: acquire:保证acquire后的读写操作不会发生在acquire动作之前 release:保证release前的读写操作不会发生在

    1.3K10
    领券