标签:#并发控制

共 40 篇文章

Volatile变量

在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。通常,volatile关键字是用来阻止(伪)编译器因誤認某段程式碼無法被程式碼本身所改變,而造成的過度優化。如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile…

Load-link/store-conditional

在電腦科學中,load-linked/store-conditional(LL/SC),也會被稱作load-reserved/store-conditional (LR/SC),load-link与store-conditional (LL/SC)是一对用于并发同步访问内存的CPU指令。Load-link返回内存位置处的当前值,随后的store-conditional在该内存位置处保存新值(如果从load-link后没有被修改)。这被用…

读写锁

读写锁是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。多读者锁,“push lock”) 用于解决。读操作可并发重入,写操作是互斥的。这意味着多个线程可以同时读数据,但写数据时需要获得一个独占的锁。当写者写数据时,其它写者或读者需要等待,直到这个写者完成写操作。读写锁常见的用法是控制线程对内存中的某种数据结构的访问,这种数据结构不能被原子性地更新,并且在完成更新之前都是无效的。 读写锁通常用互斥锁、条件变量…

監視器 (程序同步化)

監視器 (,也称为-{zh-cn:监视器; zh-tw:管程;}-) 是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享資源。這些共享資源一般是硬件或一群變數。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。 管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访…

快照隔离

快照隔离(snapshot isolation,SI)是数据库事务处理中的一个隔离级别,保证事务的读操作将看到一个一致的数据库的版本快照(实际上读取比该事务早的最后一次提交值)。该事务的写操作成功提交,仅当基于该快照的任何并发修改与该事务的修改没有冲突(即写-写冲突)。 很多重要的数据库管理系统已经采用了快照隔离,如InterBase, Firebird, Oracle, MySQL, PostgreSQL, , MongoDB 与 M…

锁 (计算机科学)

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。 一般的鎖是建議鎖(advisory lock),每個線程在訪問對應資源前都需取得鎖的資訊,再根據資訊決定是否可以存取。若存取對應資訊,鎖的狀態會改變為鎖定,因此其他線程此時不會訪問該資源,當資源結束後,會恢復鎖的狀態,允許其他線程的訪問。我们日常使用的基本都是建议锁,它并不强制生效。这里的不强制生效的意思是,如果某一个进程对一个文…

检查并设置

在計算機科學中,檢查並設置(test-and-set lock,TSL)是一種不可中斷的原子運算。TSL对某個記憶體位置写入1(set)並返回其舊值。 在多个进程可同時访问記憶體同个地址时,如果一個程式正在執行TSL,其他程式在它執行完成前不能執行TSL。中央處理器可提供TSL指令,或利用如雙埠隨機存取記憶體(Dual-ported RAM)等其它電子元件所提供的機制实现TSL。 下述为一種利用TSL指令來實現自旋鎖: function…

Futex

futex(,快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出现在内核开发的2.5.7版;其语义在2.5.40固定下来,然后在2.6.x系列稳定版内核中出现。 Futex是由Hubertus Franke(IBM Thomas J. Watson 研究中心), Matthew Kirkwood,Ingo Molnar(Red Hat)和 Rusty Russell(IBM…

全局解释器锁

全局解释器锁(,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。常见的使用 GIL 的解释器有CPython与Ruby MRI。 Python的GIL CPython的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个Python解…

自旋锁

自旋锁是计算机科学用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。 自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的。因此操作系统的实现在很多地方往往用自旋锁。Windows操作系统提供的轻型读写锁(SRW Lock)内部就用了自旋锁。显然,单核CPU不适于使用自旋锁,这里的单核CPU指的是单核单线程…

软件事务内存

在计算机科学中,软件事务内存(,縮寫為STM),又譯為交易記憶體,軟體交換式記憶體,是一种并发控制机制,模拟数据库事务的機制,控制在并行计算时对共享内存的访问控制。它是锁的一种替代机制。在STM中,一个事务指的是一段读、写共享内存的代码。这些读写操作在逻辑上是一个独立的单元,其中间状态对于其它的事务而言,是不可见的。 性能 与现在许多多线程应用程序广泛使用的锁机制不同,STM是一种非常乐观的并发控制机制:一个线程独立完成对共享内存的修改…

忙碌等待

在软件工程中,忙碌等待(也称自旋;、busy-looping、spinning)是一种以进程反复检查一个条件是否为真为根本的技术,条件可能为键盘输入或某个锁是否可用。忙碌等待也可以用来产生一个任意的时间延迟,若系统没有提供生成特定时间长度的方法,则需要用到忙碌等待。不同的计算机处理器速度差异很大,特别是一些处理器设计为可能根据外部因素(例如操作系统上的负载)动态调整速率。因此,忙碌等待这种时间延迟技术容易产生不可预知、甚至不一致的结果,…

可重入互斥锁

计算机科学中,可重入互斥锁()是互斥锁的一种,同一线程对其多次加锁不会产生死锁。可重入互斥锁也称递归互斥锁()或递归锁()。 如果对已经上锁的普通互斥锁进行「加锁」操作,其结果要么失败,要么会阻塞至解锁。而如果换作可重入互斥锁,当且仅当尝试加锁的线程就是持有该锁的线程时,类似的加锁操作就会成功。可重入互斥锁一般都会记录被加锁的次数,只有执行相同次数的解锁操作才会真正解锁。 递归互斥锁解决了普通互斥锁不可重入的问题:如果函数先持有锁,然后…

可串行性

可串行性()是指在计算机里一种多个事务先后之间穿插的用于执行正确调度方式的主要准则,亦是事务之间最高级别的隔离,在并发控制中起着至关重要的作用,其中多个事务并发时的执行顺序要对数据的一致性没有影响。 而可串行化()是指并发控制的数据库、事务处理以及各种事务性应用程序(例如,事务内存和软件事务内存)的和分布式事务排程。调度的可串行性意味对于存在共同操作对象的多个并发执行的相同事务串行执行结果(如:生成数据库状态、数据值)“等价”于某个“串…

两阶段锁

在数据库和事务处理中,两阶段锁 (Two-phase locking,2PL) 是一种保证冲突可串行化的消极并发控制方法。它也是数据库事务调度 (历史记录) 的结果集的名称。该协议使用事务对数据应用的锁,这可能会阻止 (解释为停止信号) 其他事务在事务生命周期内访问同一数据。 根据两阶段锁(2PL)协议,锁的应用和解除分为两个阶段: 扩展阶段:在此阶段中,锁被获取,且不释放任何锁。 收缩阶段:在此阶段中,锁被释放,且不再获取任何锁。 基…

并发控制

在计算机科学,特别是程序设计、操作系统、多处理机和数据库等领域,并发控制()是确保及时纠正由并发操作导致的错误的一种机制。 数据库管理系统中的并发控制 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。下面举例说明并发操作带来的数据不一致性问题: :现有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额…

悲观并发控制

在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作读某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。 优点与不足 悲观并…

競爭危害

競爭危害()又名競態條件、竞争条件(race condition),它旨在描述一個系統或者進程的輸出依赖于不受控制的事件出现顺序或者出现时机。此词源自於兩個訊號試著彼此競爭,來影響誰先輸出。 举例来说,如果计算机中的两个进程同时试图修改一个共享内存的内容,在没有并发控制的情况下,最后的结果依赖于两个进程的执行顺序与时机。而且如果发生了并发访问冲突,则最后的结果是不正确的。 競爭危害常見於不良設計的電子系統,尤其是邏輯電路。但它們在軟體中…

双重检查锁定模式

双重检查锁定模式(也被称为"双重检查加锁优化","锁暗示"(Lock hint)) 是一种软件设计模式用来减少并发系统中竞争和同步的开销。双重检查锁定模式首先验证锁定条件(第一次检查),只有通过锁定条件验证才真正的进行加锁逻辑并再次验证条件(第二次检查)。 该模式在某些语言在某些硬件平台的实现可能是不安全的。有的时候,这一模式被看做是反模式。 它通常用于减少加锁开销,尤其是为多线程环境中的单例模式实现“惰性初始化”。惰性初始化的意思是直…