atomic

What is the difference between load/store relaxed atomic and normal variable?

天涯浪子 提交于 2020-12-25 04:35:10
问题 As I see from a test-case: https://godbolt.org/z/K477q1 The generated assembly load/store atomic relaxed is the same as the normal variable: ldr and str So, is there any difference between relaxed atomic and normal variable? 回答1: The difference is that a normal load/store is not guaranteed to be tear-free, whereas a relaxed atomic read/write is. Also, the atomic guarantees that the compiler doesn't rearrange or optimise-out memory accesses in a similar fashion to what volatile guarantees.

C++11 atomic x86 memory ordering

≯℡__Kan透↙ 提交于 2020-12-25 00:00:40
问题 In one of the docs for atomic variables in C++0x, when describing memory order, it mentions: Release-Acquire Ordering On strongly-ordered systems (x86, SPARC, IBM mainframe), release-acquire ordering is automatic. No additional CPU instructions are issued for this synchronization mode, only certain compiler optimizations are affected... First is it true, that x86 follows strict memory ordering? Seems very inefficient to always impose this. Means every write and read has a fence? Also, if I

iOS求职之OC面试题

走远了吗. 提交于 2020-12-18 08:51:38
1、Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议。 2、#import和#include的区别是什么?#import<> 跟 #import""有什么区别? import能避免头文件被重复包含的问题: 1) 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include。 使用include要注意重复引用的问题: class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。 2)#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。 所以,#import比起#include的好处就是它避免了重复引用的问题。所以在OC中我们基本用的都是import。 #import<> 包含iOS框架类库里的类,#import""包含项目里自定义的类。 3、Category是什么?扩展一个类的方式用继承好还是类目好?为什么? 答 :Category是类目。用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,局限性更小,你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里, 用Category去重写类的方法,仅对本Category有效

横空出世!复盘B站面试坑我最深的Java并发:JDK源码剖析

拈花ヽ惹草 提交于 2020-12-14 17:59:30
JDK源码 对于人脑的认知来说,“代码一行行串行”当然最容易理解。但在多线程下,多个线程的代码交叉并行,要访问互斥资源,要互相通信。作为开发者,需要仔细设计线程之间的互斥与同步,稍不留心,就会写出非线程安全的代码。正因此,多线程编程一直是一个被广泛而深入讨论的领域。 由于篇幅限制,为了不影响观看,就将主要内容截图下来了,需要完整版的小伙伴可以帮LZ转发+关注,文末扫码即可免费领取~ 开始正题 第1章多线程基础 线程的状态迁移过程 第2章Atomic类 Striped64与LongAdder 第3章Lock与Condition 互斥锁 第4章同步工具类 多个线程访问 第5章并发容器 无锁链表+插入节点+ 删除节点 第6章线程池与Future 线程池的实现原理 第7章ForkJoinPool 核心数据结构 第8章CompletableFuture 任务的链式 最后 Java并发编程是每个程序员敲代码必不可少的,源码对于程序员来说也是很重要的,如果你不了解研究完这份文档,技能更上一层。 需要这份完整版《Java并发实现原理:JDK源码分析》的小伙伴可以帮LZ转发+关注,扫码即可! 来源: oschina 链接: https://my.oschina.net/u/4715492/blog/4795679

iOS多线程的锁,你知道多少?

那年仲夏 提交于 2020-12-14 10:08:36
前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知半解,于是决定整理一下关于iOS中锁的知识,为大家查缺补漏。 目录 第一部分: 什么是锁 第二部分: 锁的分类 第三部分: 性能对比 第四部分: 常见的死锁 第五部分: 总结(附 Demo ) 正文 一、什么是锁 在过去几十年并发研究领域的出版物中,锁总是扮演着坏人的角色,锁背负的指控包括引起死锁、锁封护(luyang注:lock convoying,多个同优先级的线程重复竞争同一把锁,此时大量虽然被唤醒而得不到锁的线程被迫进行调度切换,这种频繁的调度切换相当影响系统性能)、饥饿、不公平、data races以及其他许多并发带来的罪孽。有趣的是,在共享内存并行软件中真正承担重担的是——你猜对了——锁。 在计算机科学中,锁是一种同步机制,用于多线程环境中对资源访问的限制。你可以理解成它用于排除并发的一种策略。 if (lock == 0) { lock = myPID; }复制代码 上面这段代码并不能保证这个任务有锁,因此它可以在同一时间被多个任务执行。这个时候就有可能多个任务都检测到lock是空闲的,因此两个或者多个任务都将尝试设置lock,而不知道其他的任务也在尝试设置lock。这个时候就会出问题了。再看看下面这段代码(Swift): class Account {

Linux内核中锁机制之原子操作、自旋锁

。_饼干妹妹 提交于 2020-12-14 04:42:50
很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态。这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题。 通常情况下,如图 1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程 1先对临界区完成操作,然后进程 2再去操作临界区。但是往往现实总是残酷的,进程 1在执行过程中,进程 2很可能在此插入一脚,导致两个进程同时对临界区进行读写访问,读是没有问题,但写的话问题就大了。这样的话,得到的结果往往不是我们想要的。 图 1 一个简单的例子 因此,我们需要一些解决方法,在 Linux内核中它提供了如下几种锁机制,供用户在针对不同情况分别或配合使用,包括:原子操作、自旋锁、内存屏障、读写自旋锁、顺序锁、信号量、读写信号量、完成量、 RCU机制、 BKL(大内核锁 )等等,下面笔者将分五篇博文一一讨论这些锁机制。另外,本文所涉及的关于 Linux内核源码采用版本为: Linux 3.3.1。 OK,让我们首先讨论有关原子操作和自旋锁的相关内容吧。 一、原子操作 所谓的原子操作即是保证指令以原子的方式执行,它在执行过程中不被打断。它包括了原子整数操作和原子位操作,在内核中分别定义于 include

java并发:原子类之AtomicLong

旧街凉风 提交于 2020-12-13 16:35:09
原子类之AtomicLong java线程中的操作,需要满足原子性、可见性等原则,比如i++这样的操作不具备原子性, A线程读取了i,另一个线程执行i++,A线程再执行i++就会引发线程安全问题 推荐学习的AtomicInteger和AtomicLong博客 你还在用Synchronized?Atomic你了解不? Java多线程系列--“JUC原子类”02之 AtomicLong原子类 一个非原子性的自加引发的安全例子 下面的例子执行1000个线程,有意思的还Long自加比Interger更容易发现结果是比1000小。 package com.java.javabase.thread.base.concurrent.atomic; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @Slf4j public class AtomicLongtest { public static void main(String[] args) { AtomicLongtest test =new

聊聊golang的zap的ZapKafkaWriter

一个人想着一个人 提交于 2020-12-11 01:13:30
序 本文主要研究一下golang的zap的ZapKafkaWriter ZapKafkaWriter package logger import ( "errors" "sync" "sync/atomic" "syscall" ) // ZapKafkaWriter is a zap WriteSyncer (io.Writer) that writes messages to Kafka type ZapKafkaWriter struct { kp *KafkaProducer ce *CloudEvents closed int32 // Nonzero if closing, must access atomically pendingWg sync.WaitGroup // WaitGroup for pending messages closeMut sync.Mutex } // newZapKafkaWriter returns a kafka io.writer instance func newZapKafkaWriter( kpCfg ProducerConfiguration, cloudEvents *CloudEvents, ceCfg CloudEventsConfiguration) (*ZapKafkaWriter, error) { //

Django基础六之ORM中的锁和事务

…衆ロ難τιáo~ 提交于 2020-12-06 06:02:57
一 锁    行级锁     select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节。     返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT ... FOR UPDATE 语句。     举个例子: entries = Entry.objects.select_for_update().filter(author=request.user) #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。 create、update、delete操作时,mysql自动加行级互斥锁     所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。     一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。 如果这不想要使查询阻塞的话,使用select_for_update(nowait=True)。 如果其它事务持有冲突的锁,互斥锁, 那么查询将引发 DatabaseError 异常。你也可以使用select_for_update(skip_locked=True)忽略锁定的行。 nowait和skip_locked是互斥的,同时设置会导致ValueError。     目前

Django之ORM中事务和锁

旧巷老猫 提交于 2020-12-06 05:56:54
ORM 事务: 事务: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 事务的特点: 并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为 ACID 特性。 1. 原子性( Atomicity ):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 2. 一致性( Consistency ):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。 3. 隔离性( Isolation ):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 4. 持久性( Durability ):已被提交的事务对数据库的修改应该永久保存在数据库中。 事务开启的三种方式: 全局开启(中间件): settings. py 文件配置: DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.sqlite3' , 'NAME' : 'day062' , 'USER' : 'root' , 'PASSWORD' : '' , 'HOST' : '127.0.0.1' , 'PORT' : 3306 , # 'OPTIONS': { # 'init_command': "SET